中断或停止睡眠线程

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

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

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

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

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

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

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

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

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

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