java - isInterrupted() 未触发

标签 java multithreading java-8

用interrupt()做实验,发现isInterrupted()总是false。

另一件事是用 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();

关于java - isInterrupted() 未触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62850821/

相关文章:

java - 为什么这段代码没有像 JSR133 所建议的那样进入无限循环?

java - 如何找到两个给定范围之间的重叠?

java - Quartz 从按组条件过滤的数据库加载作业

c# - .Net : Threadify heavy API calls

java - 尝试使用 IntStream.range() 并获取 "This static method can only be accessed..."

java - 可选与 Guava 可选

Java 8、等于、== 和 Lambda

java - WebSphere Application Server JVM 参数未被正确读取

Java:使用相关数组对Arraylist进行排序

python - 如何优雅地杀死正在监听消息队列的线程