【问题标题】:isInterrupted() is not triggeredisInterrupted() 未触发
【发布时间】:2020-07-11 15:05:11
【问题描述】:

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

另一件事是,将 isInterrupted() 替换为 Thread.interrupted() 将使线程停止。

有人可以解释为什么会发生这种行为吗?

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;
                }
            }
        }
    }

【问题讨论】:

    标签: java multithreading java-8


    【解决方案1】:

    您有两个线程对象:Worker 本身就是一个线程,您将其包装在一个新的单独的 Thread 对象中:

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

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

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

    如果去掉外线程对象,代码会更清晰:

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

    【讨论】:

      【解决方案2】:

      你应该这样初始化你的计数器:

       Thread counter = new Worker();
      

      由于Worker extends Thread 但它作为Runnable 传递,因此您有两个不同的Thread 实例。

      但是Thread.interrupted() 会中断当前线程,因此它可以工作。

      作为上述解决方案的替代方案,将isInterrupted() 替换为Thread.currentThread().isInterrupted()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-26
        • 2020-11-26
        相关资源
        最近更新 更多