java - isInterrupted() 未触发
问题描述
试验了interrupt(),发现isInterrupted()总是假的。
另一件事是用Thread.interrupted()替换isInterrupted()将使线程停止。
有人可以解释为什么会发生这种行为吗?
public static void main(String[] args) {
Thread counter = new Thread(new Worker());
counter.start();
counter.interrupt();
}
static class Worker extends Thread {
@Override
public void run() {
String msg = "It was interrupted";
while (true) {
if (isInterrupted()) {
System.out.println(msg);
return;
}
}
}
}
解决方案
您有两个线程对象:Worker
它自己是一个线程,并且您将其包装在一个新的单独Thread
对象中:
Thread counter = new Thread(new Worker());
这两个线程对象有两个中断标志。调用counter.interrupt()
设置外部线程对象中的中断标志,而调用isInterrupted()
检查内部“Worker”线程对象中的中断标志。
使线程停止的原因Thread.interrupted()
是因为它检查当前正在运行的线程的中断标志,在这种情况下将是外部对象。
如果您摆脱外部线程对象并编写以下代码,代码会更清晰:
Worker counter = new Worker();
counter.start();
counter.interrupt();
推荐阅读
- regex - 突出显示重复项,包括 Google 表格中的部分文本匹配
- sql - 如何在视图中使用 IF 语句来删除/使用#Temp 表?
- python-3.x - 对networkx中的图节点进行排序
- javascript - 如何从 highlight.js 元素中获取纯文本?
- javascript - axios 获取响应未定义
- git - Git diff 所有本地未提交的更改
- python - 如何从不同位置导入机器人文件
- python - 找到从列表中对每个整数求和获得的最小和
- ruby-on-rails - 使用 2 个 if 语句与 if/elsif?为什么一个有效而另一个无效
- api - 加载资源失败:net::ERR_CONNECTION_RESET