java 子线程A如何终止子线程B

这是我的代码,问题是子线程 T1 并未终止子线程 T ,请看源码

public class ThreadExit {
    public static void main(String[] args) {
        T1 t1 = new T1();
        Thread thread = new Thread(t1);
        thread.start();

        T t = new T();
        t.start();

    }
}

class T extends Thread {

    private int count = 0;
    private boolean loop = true;
    @SuppressWarnings("all")
    @Override
    public void run() {
        while(loop){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Thread T in progress..." + (++count));
        }
    }

    public void setLoop(boolean loop) {
        this.loop = loop;
    }
}

class T1 implements Runnable {

    @Override
    public void run() {
        T t = new T();
        System.out.println("Thread T1 whill to sleep for 5s ...");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Thread T1'll stop T, T are about to exit !");
        t.setLoop(false);
    }
}


你认为你在t1里面new的T 和main方法里面的t,数据会是一个嘛?

参考GPT和自己的思路:在你的代码中,子线程T1创建了一个新的子线程T,并且试图通过设置T的loop变量来终止T线程。但是,由于T和T1是两个不同的线程对象,因此T1并不能直接访问和操作T线程的变量和状态。因此,在你的代码中,T线程并没有被成功终止。

如果想要让T1线程能够终止T线程,可以考虑使用线程通信的方式。例如,T1线程可以通过调用T线程的interrupt()方法来中断T线程的执行。在T线程的run()方法中可以检查线程中断标志位,如果被设置了,则立即退出执行。具体代码如下:

class T extends Thread {
    private int count = 0;

    @Override
    public void run() {
        while (!Thread.currentThread().isInterrupted()) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
            System.out.println("Thread T in progress..." + (++count));
        }
        System.out.println("Thread T has been terminated!");
    }
}

class T1 implements Runnable {
    @Override
    public void run() {
        T t = new T();
        t.start();

        System.out.println("Thread T1 whill to sleep for 5s ...");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("Thread T1'll stop T, T are about to exit !");
        t.interrupt();
    }
}

在上面的代码中,T线程在每次循环开始前,都会检查当前线程的中断标志位,如果被设置了,则退出循环并打印线程已经终止的信息。T1线程在调用T的interrupt()方法之后,T线程就会在下一次循环时退出执行,从而达到了终止T线程的目的。