即使在Java线程中的Thread.State为“TERMINATED”之后,isInterrupted()仍然返回“false”-为什么?

当线程被终止 ( Thread.State.TERMINATED) 时,它仍然没有被中断。为什么?

我找到了这个,我找到了这个,但都没有回答我的问题。我已经在 OpenJDK 11 和 Oracle JDK 16 上尝试过这个 - 没有区别,结果相同。

我已经使用 Java 10 多年了,多线程任务对我来说一直很清楚;然而,意外地,我遇到了一些奇怪的事情(对我来说),我很想知道。

我明白了,那private volatile boolean interrupted;是刚刚下课的标志(场)Thread,这我能在结合使用interrupt()时,以代码的一些逻辑了的情况下isInterrupted()获得true

但是,为什么Thread.State.TERMINATEDstate 不也创建相同的线程interrupted

public class MainClass {

    public static void main(String[] args) throws Exception {
        Thread alfa = new Thread(() -> {
            for (int i = 0; i < 3; i++) {
                System.out.println(i + ". " + Thread.currentThread().getName() + " state: " + Thread.currentThread().getState().name());
                try {Thread.sleep(1000);} catch (Exception e) {}
            }
        });
        alfa.setName("Alfa thread");
        System.out.println(alfa.getName() + " state before invoking .start() is: " + alfa.getState().name());
        alfa.start();
        int i = 0;
        while (true) {
            ++i;
            System.out.println(i + ". " + alfa.getName() + " state: " + alfa.getState().name());
            System.out.println(i + ". " + alfa.getName() + " is interrupted?: " + alfa.isInterrupted());
            Thread.sleep(1000);
        }
    }
}

证明,这:

Alfa thread state before invoking .start() is: NEW
1. Alfa thread state: RUNNABLE
0. Alfa thread state: RUNNABLE
1. Alfa thread is interrupted?: false
1. Alfa thread state: RUNNABLE
2. Alfa thread state: TIMED_WAITING
2. Alfa thread is interrupted?: false
2. Alfa thread state: RUNNABLE
3. Alfa thread state: TIMED_WAITING
3. Alfa thread is interrupted?: false
4. Alfa thread state: TERMINATED //alfa is terminated!
4. Alfa thread is interrupted?: false //alfa is not interrupted. Seriously?
  • 我是不是没有得到一些东西,这是故意这样做的,因为它在幕后有一些想法?或者
  • 这只是一些忘记正确实施的东西吗?

回答

A Thread.StateofTERMINATED表示指定Thread已完成执行。终止Thread不会被中断,您可能将两者混为一谈,这是不同的。

isInterrupted()仅当线程已通过该interrupt()方法被另一个线程中断时,该方法才返回 true 。

看看这里:https :
//docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html

线程终止并不意味着线程中断,因为它们是两个不同且独立的事物。

编辑:

我在评论中看到你对中断有点困惑,所以我想澄清一下。

因此,基本上中断是对线程的指示,它应该停止当前正在执行的操作,并执行其他操作。因此,中断的线程不会停止或挂起(因为您使用了恢复一词),但它是一个应该停止正在执行的操作的线程。例如,假设一个名为的线程myThread当前正忙于一个非常长的操作,如下所示:

public void reallyLongOperation() throws InterruptedException {
  // the thread will stay in the loop for a long time
  while(!taskFinished){
    //stuff repeated for many cycles
    if(Thread.interrupted()){
      throw new InterruptedException("The really long operation has been interrupted");
    }
  }
}

现在,假设用户想要通过按下 GUI 上的按钮来取消这个非常长的操作。该AWT-EventQueue线程调用myThread.interrupt()。现在myThread仍在循环中做事,但是当线程达到条件时,Thread.interrupted()清除标志并返回真,因为它已被中断。InterruptedException被抛出,我们必须像处理其他所有已检查异常一样处理它。

现在,myThread.isInterrupted()和之间有什么区别Thread.interrupted()

  • myThread.isInterrupted()仅当中断标志为真时才返回真。但是,它不会重置标志。
  • Thread.interrupted() 是一个静态方法,和前者一样,如果中断标志为真则返回真,但它也会清除它。

当一个线程死了,并且它从未被中断,或者如果之前已经清除了标志,上述两种方法都将返回 false。

线程中断与线程的状态无关,也与挂起无关。


以上是即使在Java线程中的Thread.State为“TERMINATED”之后,isInterrupted()仍然返回“false”-为什么?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>