如何在java中停止或中断睡眠线程?我有一个同步数据并在run()方法中休眠10分钟的线程,如果我想通过在线程休眠时停止线程来停止同步。如何实现这一目标?
答案 0 :(得分:19)
调用线程上的interrupt()方法。这将导致取消睡眠并抛出InterruptedException。
答案 1 :(得分:11)
您可以使用Thread.interrupt()
中断睡眠线程。现在停止一个线程已被弃用 - 如果该线程正在锁定某个东西怎么办? (有一个Thread.stop()
,但强烈建议不要这样做。)
或者,您可以让线程等待超时通知对象,而不是休眠,如果您希望线程被唤醒,则可以简化通知对象。
答案 2 :(得分:6)
阻止诸如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
中设置了一个标记,并且扩展的Thread
或Runnable
对象必须检查它是否已被Thread.interrupted()
中断,以执行其操作#39;应该在被打断时做。
interrupt()
也会停止wait()
或sleep()
,但请注意这些方法是UNSET中断标志。因此,如果您在休眠/等待线程上调用interrupt()
,它将停止休眠/等待,但不会知道它被中断,除非您捕获异常,并且不会继续被中断。
我能够通过实现自己的中断标志来修复我的程序,该标志无法被sleep()
和wait()
方法覆盖。另外,请知道您可以使用Thread.currentThread().interrupt()
从内部中断线程。