中断或停止睡眠线程

时间:2010-11-24 07:25:17

标签: java multithreading sleep

如何在java中停止或中断睡眠线程?我有一个同步数据并在run()方法中休眠10分钟的线程,如果我想通过在线程休眠时停止线程来停止同步。如何实现这一目标?

5 个答案:

答案 0 :(得分:19)

调用线程上的interrupt()方法。这将导致取消睡眠并抛出InterruptedException。

答案 1 :(得分:11)

您可以使用Thread.interrupt()中断睡眠线程。现在停止一个线程已被弃用 - 如果该线程正在锁定某个东西怎么办? (有一个Thread.stop(),但强烈建议不要这样做。)

或者,您可以让线程等待超时通知对象,而不是休眠,如果您希望线程被唤醒,则可以简化通知对象。

答案 2 :(得分:6)

Suresh,我希望关注一个问题。 interrupt()方法本身不会中断线程。它只是通过将标志设置为true来向线程发送请求以进行中断。通常,您的线程应该处理取消/中断策略。 Java Concurrecy in Practice,第7.1节“任务取消”对此进行了详细描述。

阻止诸如Thread.sleep和Object.wait之类的库方法尝试检测线程何时被中断并提前返回。它们通过清除中断状态并抛出InterruptedException来响应中断。

答案 3 :(得分:2)

Frederik是对的:调用Thread.interrupt(); 我只是想警告你不要使用 stop(),因为它自java 1.1以来已被弃用。 和其他警告。我认为如果你正在使用sleep()并希望中断线程,那么考虑移动到wait()和notify()是一个好时机。有很多关于java线程的教程和java.lang.Thread的javadoc已经足够好了,所以如果你不熟悉这些API,你可以继续阅读。

答案 4 :(得分:1)

由于我无法发表评论,我将发布另一个答案。我只想强调并澄清亚历山大所说的话。 interrupt()仅在Thread中设置了一个标记,并且扩展的ThreadRunnable对象必须检查它是否已被Thread.interrupted()中断,以执行其操作#39;应该在被打断时做。

interrupt()也会停止wait()sleep(),但请注意这些方法是UNSET中断标志。因此,如果您在休眠/等待线程上调用interrupt(),它将停止休眠/等待,但不会知道它被中断,除非您捕获异常,并且不会继续被中断。

我能够通过实现自己的中断标志来修复我的程序,该标志无法被sleep()wait()方法覆盖。另外,请知道您可以使用Thread.currentThread().interrupt()从内部中断线程。