【问题标题】:Java Thread.suspend() gracefullyJava Thread.suspend() 优雅地
【发布时间】:2016-01-28 21:08:29
【问题描述】:

编辑:更新问题以准确解释我需要什么。

所以我将一个 javaagent 附加到一个进程使用

VirtualMachine vm = VirtualMachine.attach(processPid);
vm.loadAgent(jarPath);

现在我的代理在单独的线程上运行。现在我需要做的是在任何类加载之前加载我所有的转换器。附加进程中有一个线程加载所有类。我希望能够在正确的时间挂起这个线程(不会导致死锁)等待我的所有初始化(包括下载)然后注册我的转换器。在加载主类之前注册转换器很重要,这样我就可以根据需要修改类。

我目前只是通过它的名称获取线程并在其上调用suspend()。但这会导致死锁。有什么办法可以让那个线程等待我吗?

我尝试过的事情:

  1. 立即转换主类以添加 Thread.sleep(),但无法正常工作,因为我的代理在主类之后加载
  2. 使用Thread.suspend 会导致死锁。

【问题讨论】:

  • 如果您要问一个您似乎知道非常棘手或不可能的问题,为什么不向我们提供所有信息 - 完整描述您想要完成的内容以及您需要的原因做你想做的事

标签: java multithreading thread-safety


【解决方案1】:

“我无法控制的线程”是什么意思?如果你的代码调用t.suspend(),那么一种控制。您是想告诉我们线程执行了您无法获取源代码的代码吗?


“优雅地暂停”是什么意思?如果您的程序调用t.suspend(),您的程序是否有可能决定它是否在“好”时间暂停了线程?

您说您想在程序执行其他操作时暂停线程。你能更详细地解释一下线程做什么,你希望你的程序在线程挂起时做什么,以及为什么你不能让这两种事情同时发生吗?

如果您的程序可以区分好时间和坏时间,并且选择了不好的时间,那么程序恢复线程然后稍后重试是否有意义?

【讨论】:

  • 好的,我更新了我的问题。是的,我可以等待并确定何时可以调用暂停。因为它只会时不时地导致死锁,所以我确信有一些方法可以确定我暂停线程的那一刻。
  • 所以,根据你的更新,听起来这不是一个周期性的任务,而是你只想做一次的事情,听起来机会之窗很窄。 IMO,您将不得不找到一种不同的方法来解决您的问题。
猜你喜欢
  • 1970-01-01
  • 2010-11-01
  • 2011-03-12
  • 1970-01-01
  • 1970-01-01
  • 2015-07-30
  • 2010-11-29
  • 2011-08-08
相关资源
最近更新 更多