关于java:中断或停止休眠线程

Interrupting or stopping a sleeping thread

本问题已经有最佳答案,请猛点这里访问。

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


在线程上调用interrupt()方法。这将导致取消睡眠,并引发InterruptedException。


您可以使用Thread.interrupt()中断休眠线程。现在停止线程是不赞成的——如果线程持有某个对象的锁怎么办?(当时有一个Thread.stop(),但非常不鼓励)。

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


当然,我想关注一个问题。interrupt()方法本身不中断线程。它只是通过将标志设置为true向线程发送中断请求。通常,线程应该处理取消/中断策略。它在Java的实践中被大量描述,第7.1节任务取消。

阻塞库方法,如thread.sleep和object.wait,尝试检测线程何时被中断并提前返回。它们通过清除中断状态和抛出中断异常来响应中断。


Frederik是对的:call thread.interrupt();我只是想警告您不要使用StUTE(),因为它是Java 1.1以来所禁止的。以及其他警告。我认为,如果您使用sleep()并希望中断线程,那么现在是考虑转移到wait()和notify()的好时机。有很多关于Java线程的教程,Java.Lang.Type的JavaDoc是足够好的,所以如果你不熟悉这些API,你可以继续阅读。


既然我不能发表评论,我会再发表一个答案。我只是想加强和澄清亚历山大所说的话。interrupt()只在Thread中设置一个标志,扩展的ThreadRunnable对象必须检查它是否被Thread.interrupted()中断,以便在中断时做它应该做的事情。

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

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