你能解释一下调用java.lang.Thread.interrupt()时做什么吗?
当前回答
如果目标线程一直在等待(通过调用wait(),或其他一些本质上做同样事情的相关方法,如sleep()),它将被中断,这意味着它将停止等待它正在等待的东西,而是接收一个InterruptedException。
完全由线程本身(调用wait()的代码)决定在这种情况下做什么。它不会自动终止线程。
它有时与终止标志结合使用。当被中断时,线程可以检查这个标志,然后关闭自己。但这只是惯例。
其他回答
thread. interrupt()将目标线程的中断状态/标志设置为true,当使用thread. interrupted()检查时,可以帮助停止无休止的线程。请参阅http://www.yegor256.com/2015/10/20/interrupted-exception.html
thread. interrupt()设置目标线程的中断状态/标志。然后在目标线程中运行的代码可以轮询中断状态并适当地处理它。一些阻塞的方法,如Object.wait()可能会立即使用中断状态并抛出适当的异常(通常是InterruptedException)
Java中的中断不是先发制人的。换句话说,两个线程必须合作才能正确地处理中断。如果目标线程没有轮询中断状态,中断将被有效地忽略。
轮询通过thread .interrupted()方法进行,该方法返回当前线程的中断状态并清除中断标志。通常,线程可能会做一些事情,例如抛出InterruptedException。
EDIT(来自Thilo评论):一些API方法内置了中断处理。在我的头顶,这包括。
Object.wait(), Thread.sleep()和Thread.join() 大多数java.util.concurrent结构 Java NIO(但不是Java .io),它不使用InterruptedException,而是使用ClosedByInterruptException。
编辑(来自@thomas-pornin对完全相同问题的回答)
线程中断是轻推线程的一种温和方式。它用于给线程一个干净地退出的机会,而不是thread .stop(),后者更像是用突击步枪射击线程。
如果目标线程一直在等待(通过调用wait(),或其他一些本质上做同样事情的相关方法,如sleep()),它将被中断,这意味着它将停止等待它正在等待的东西,而是接收一个InterruptedException。
完全由线程本身(调用wait()的代码)决定在这种情况下做什么。它不会自动终止线程。
它有时与终止标志结合使用。当被中断时,线程可以检查这个标志,然后关闭自己。但这只是惯例。
在以上回答的基础上,我想补充一两件事。
需要记住的一件事是,调用中断方法并不总是会导致InterruptedException。因此,实现代码应该定期检查中断状态并采取适当的操作。 thread. currentthread (). isinterrupted()也可以用来检查线程的中断状态。与Thread.interrupted()方法不同,它不清除中断状态。
Thread.interrupt()方法设置内部的“中断状态”标志。通常该标志由Thread.interrupted()方法检查。
按照惯例,任何通过InterruptedException存在的方法都必须清除中断状态标志。
推荐文章
- Java中的split()方法对点(.)不起作用。
- Eclipse调试器总是阻塞在ThreadPoolExecutor上,没有任何明显的异常,为什么?
- Java生成两个给定值之间的随机数
- 如何有效地从数组列表或字符串数组中删除所有空元素?
- 比较JUnit断言中的数组,简洁的内置方式?
- codestyle;把javadoc放在注释之前还是之后?
- 如何在Spring中定义List bean ?
- 将Set<T>转换为List<T>的最简洁的方法
- 在JavaScript中,什么相当于Java的Thread.sleep() ?
- 使用Java重命名文件
- URL从Java中的类路径加载资源
- .toArray(new MyClass[0]) or .toArray(new MyClass[myList.size()])?
- Hibernate中不同的保存方法之间有什么区别?
- Java 8流和数组操作
- 如何获得GDB中所有线程的回溯?