我研究Java线程,无法理解一会儿:
在下面的代码中

public class ThreadsTest {
    public static void main(String[] args) throws Exception{

        ExtendsThread extendsThread = new ExtendsThread();
        Thread et = new Thread(extendsThread);
        et.start();
        Thread.sleep(1500);
        ir.interrupt();
    }
}

public class ExtendsThread extends Thread {
    private Thread currentThread = Thread.currentThread();
    public void run() {
        while (!currentThread .isInterrupted()) {}
        System.out.println("ExtendsThread " + currentThread().isInterrupted());

    }
}

线程不会停止。
但是,如果在ExtendsThread类中,我检查while (!Thread.currentThread().isInterrupted())线程是否停止。
为什么private Thread currentThread = Thread.currentThread();不引用当前线程?

最佳答案



因为在此变量初始化时,您位于主线程上。 (变量是在您执行ExtendsThread extendsThread = new ExtendsThread();时初始化的,这是通过main完成的。)

但是,代码还有其他问题。

  • 您正在检查currentThread而不是this线程上的中断。因此,首先将ExtendsThread代码更改为:
    class ExtendsThread extends Thread {
        public void run() {
            while (!isInterrupted()) {
            }
            System.out.println("ExtendsThread " + isInterrupted());
        }
    }
    
  • 然后您将继承弄乱了。当您这样做时:
    ExtendsThread extendsThread = new ExtendsThread();
    Thread et = new Thread(extendsThread);
    

    这意味着您要将一个线程包装在另一个线程中。 (因此,当您中断时,您正在中断外线程,但是您正在检查内线程是否中断。)您可能只想摆脱包装线程,然后执行
    ExtendsThread et = new ExtendsThread();
    

  • 这是代码的完整工作版本:
    public class ThreadsTest {
    
        public static void main(String[] args) throws Exception{
            ExtendsThread et = new ExtendsThread();
            et.start();
            Thread.sleep(1500);
            et.interrupt();
        }
    }
    
    class ExtendsThread extends Thread {
        public void run() {
            while (!isInterrupted()) {
            }
            System.out.println("ExtendsThread " + isInterrupted());
        }
    }
    

    关于java - 为什么isInterrupted()给出除Thread.currentThread()。isInterrupted()(JAVA)之外的其他结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28628870/

    10-12 05:02