java - 为什么中断方式和 isInterrupted 行为方式之间存在差异?
问题描述
我只是通过Javadoc 进行中断。我确实得到了 Thread 类的两种方法之间的区别:interrupted() 和 isInterrupted()。引用文档:
当线程通过调用静态方法 Thread.interrupted 检查中断时,中断状态被清除。一个线程用来查询另一个线程的中断状态的非静态 isInterrupted 方法不会改变中断状态标志。
我不明白为什么这种行为一直如此?是否有任何理由interrupted
重置当前线程的状态而isInterrupted
不是调用它的线程?
解决方案
Thread.interrupted
只适用于当前线程;这是一种静态方法。
new Thread(() -> {
while (true) {
if (Thread.interrupted()) {
break;
}
System.out.println("Running");
}
});
清除标志很方便,因为执行检查的线程预计会对中断做出反应并以某种方式处理它。如果您想再次重置标志,这很简单:只需调用interrupt
.
isInterrupted
不是静态方法。它被设计为可能被其他线程调用。
Thread foo = new Thread(/*...*/);
foo.start();
//...
if (foo.isInterrupted())
{
//do something
}
首先,其他线程在概念上不应该能够判断foo
它不再被中断。foo
必须自己处理中断 - 其他线程不能foo
代表它。
从实现的角度来看,如果这个方法要自动清除标志,那么这个检查然后重置必须是原子的,以避免线程foo
在标志被重置之前读取它。您必须以某种方式与线程本身共享此互斥锁。这将使该isInterrupted
方法使用起来非常笨拙。
推荐阅读
- java - 如何在android中保存类似的按钮状态?
- javascript - 从此 JS 输出中删除逗号“,”并使用换行符代替 , 逗号
- jquery - 更改日历中的语言 - dateTimePicker
- python - Heroku 错误 - 通过 Heroku/Git 插件部署 python 时出现“Command errored out with exit status 1”
- mysql - 在 SQL 中通过一个匹配键关联两个表?
- javascript - 显示无法在 Elementor _content_template() 方法中设置属性“innerHTML”
- python - Python Pandas中DataFrame中的月数计算?
- windows - 为什么 [CONSOLE]::NumberLock 在远程桌面系统中不起作用
- c# - 如何在 FHIR API 中更新患者?
- javascript - 为什么幻灯片不起作用(不再)?