首页 > 解决方案 > 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;
                }
            }
        }
    }

标签: javamultithreadingjava-8

解决方案


您有两个线程对象:Worker它自己是一个线程,并且您将其包装在一个新的单独Thread对象中:

Thread counter = new Thread(new Worker());

这两个线程对象有两个中断标志。调用counter.interrupt()设置外部线程对象中的中断标志,而调用isInterrupted()检查内部“Worker”线程对象中的中断标志。

使线程停止的原因Thread.interrupted()是因为它检查当前正在运行的线程的中断标志,在这种情况下将是外部对象。

如果您摆脱外部线程对象并编写以下代码,代码会更清晰:

Worker counter = new Worker();
counter.start();
counter.interrupt();

推荐阅读