【问题标题】:How to kill a thread that is waiting on synchronized resource?如何杀死正在等待同步资源的线程?
【发布时间】:2015-11-22 16:53:44
【问题描述】:

假设一个名为Prey 的类扩展了Thread,并且一个名为deerPrey 的对象在synchronized 资源上处于等待状态。现在我想强行杀死这个处于等待状态的deer。以下哪一项是杀死deer的正确方法。

  1. deer.interrupt();
  2. deer.notify(); deer.interrupt();
  3. deer.notify(); deer.killmeBoolean(true);
  4. deer.killmeBoolean(true); deer.notify();

其中killmeBoolean(boolean) 用于设置一个标志,以便deer 线程可以从while(flag) 循环中终止。

【问题讨论】:

  • 对我来说好像是作业。
  • 是 1) 如果你中断的代码写得正确。但不能保证:ibm.com/developerworks/library/j-jtp05236(或阅读 jcip.net 书)。 Thread.currentThread().isInterrupted() 通常(减去通过 InterruptedException 停止时不设置中断标志的代码)与自定义布尔值一样好,因此您不需要。
  • @VinodMadyalkar 一个中断不会释放任何锁,除非线程被实现为这样做。

标签: java multithreading concurrency synchronization


【解决方案1】:

您可以在线程正在等待的资源上调用notifynotifyAll。这将告诉线程资源已“准备好”并继续其工作。请注意,只有当资源上的锁被释放时,线程仍然可以继续。

或者,你调用deer.interrupt() 告诉线程停止它正在做的事情。这将通过抛出InterruptedException 来取消等待操作。通常预计线程会尽快清理并停止,但是,处理中断取决于线程的实现(即,在这种情况下,您自己的代码)。

设置killMeBoolean只会在线程运行并检查相应变量时生效。为此,您可以使用上述任一方法。

【讨论】:

  • 1 或 4 是否正确取决于您的实现。如果 1 是正确的,那么 2 也应该有效。 3 和 4 基本相同,但 3 可能会导致赛车条件出错。
猜你喜欢
  • 2013-10-26
  • 1970-01-01
  • 1970-01-01
  • 2011-05-26
  • 1970-01-01
  • 2021-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多