中断或停止一个休眠线程

21
如何在Java中停止或中断正在睡眠的线程?我有一个同步数据并在run()方法中休眠10分钟的线程,如果我想通过停止线程来停止同步,该怎么做?如何实现?
```html

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

```

2
精确的副本不再存在 :-( - René Nyffenegger
1
该问题的重复已被作者删除,因此这个问题应该被重新开放吗? - skynet
5个回答

21

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


2
如果线程没有休眠,但我仍然想做类似于Thread.sleep的操作,该怎么办? - Jaydev

13

你可以使用Thread.interrupt()中断一个休眠的线程。现在停止线程已经过时了——如果线程正在持有某个锁怎么办?(曾经有一个Thread.stop()方法,但是它被强烈反对)。

或者,你可以让你的线程在等待一个对象被通知时设置超时时间,如果你想唤醒线程,就简单地通知这个对象。


6
Suresh,我想提醒您一个问题。interrupt()方法本身并不会中断线程。它只是通过将标志设置为true向线程发送中断请求。通常,您的线程应该处理取消/中断策略。在Java Concurrency in Practice第7.1节任务取消中有很好的描述。
阻塞库方法如Thread.sleep和Object.wait尝试检测线程是否被中断并提前返回。它们通过清除中断状态并抛出InterruptedException来响应中断。

4

由于我无法评论,所以我会发布另一个答案。我只想强调并澄清Alexandr所说的内容。 interrupt() 仅在 Thread 中设置标志,扩展的 ThreadRunnable 对象必须使用 Thread.interrupted() 检查是否已被中断,以执行其应在中断时执行的操作。

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

通过实现自己的中断标志,我能够修复我的一个程序,这个标志不能被 sleep()wait() 方法覆盖。还要知道,您可以使用 Thread.currentThread().interrupt() 在内部中断线程。


2

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接