这是我的代码,问题是子线程 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线程的目的。