中断或停止睡眠线程
调用线程上的interrupt()方法。这将导致睡眠被取消,并引发InterruptedException。
您可以用Thread.interrupt()
中断睡眠线程。现在停止线程已被弃用 - 如果线程正在锁定某个东西,该怎么办? (有一个Thread.stop()
,但它非常不鼓励)。
或者,您可以让线程等待通过超时来通知对象,并且如果希望线程唤醒,则简化通知对象。
Frederik是对的:call Thread.interrupt(); 我只是想警告你不要使用 stop(),因为它从java 1.1开始已被弃用。 等警告。我认为如果您使用sleep()并希望中断该线程,那么考虑移动到wait()和notify()是一个好时机。有很多关于Java线程的教程,java.lang.Thread的javadoc已经足够好了,所以如果你不熟悉这些API,你可以继续阅读。
苏雷什,我想关注一个问题。 interrupt()方法本身不会中断线程。它只是通过将标志设置为true来向线程发送中断请求。通常你的线程应该处理取消/中断策略。 Java实践中的并发性第7.1节“任务取消”对此有很好的描述。
阻止诸如Thread.sleep和Object.wait之类的库方法试图检测线程何时被中断并提前返回。他们通过清除中断状态并抛出InterruptedException来响应中断。
由于我无法评论,我会发表另一个答案。我只是想强化和澄清什么亚历山大说。 interrupt()
仅在Thread
中设置了一个标志,并且扩展的Thread
或Runnable
对象必须检查它是否被Thread.interrupted()
中断,以执行中断时应该执行的操作。
interrupt()
也停止wait()
或sleep()
,但要注意那些方法UNSET中断标志。因此,如果您在睡眠/等待线程中调用interrupt()
,它将停止睡眠/等待,但不会知道它已被中断,除非您发现异常并且不会继续中断。
我能够通过执行我自己的中断标志来修复我的程序,这个标志不能被sleep()
和wait()
方法覆盖。另外,要知道你可以用Thread.currentThread().interrupt()
中断一个线程。
确切的重复是不存在了:-( – 2012-04-06 08:31:48
应该重新打开这个问题,因为它的重复被作者删除了吗? – Craigy 2012-07-19 19:30:47