尝试使用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/

10-10 21:45