Thread的interrupt()没终止线程

时间:2021-04-06 21:03:19
[code=Java]
public class Interrupt implements Runnable{

public static void main(String[] args) throws InterruptedException {
Thread t0=new Thread(new Interrupt());
t0.start();
Thread.sleep(2000);
t0.interrupt();
Thread t1=new Thread(new Interrupt());
t1.start();

}

public void run() {
while(true){
System.out.println(Thread.currentThread().getName());
}
}

}
希望2秒后关闭线程t0,重新打开线程t1,可是2秒后运行结果是两个线程在交替运行:
Thread-1
Thread-0
Thread-0
。。
Thread-1
Thread-1
。。

我这里是希望一个java进程自身重启,如果终止进程的话,再次运行只能运行一个jar包,就跑到dos窗口下了,不在eclipse控制台,所以希望用线程,这个interrupt()方法是做什么用的,怎么用?

5 个解决方案

#1


public class Text implements Runnable {
boolean panduan = false;
public boolean isPanduan() {
return panduan;
}
public void setPanduan(boolean panduan) {
this.panduan = panduan;
}
public void run() {
while (panduan) {
System.out.println(Thread.currentThread().getName());
}
}
public static void main(String[] args) throws InterruptedException {
Text text1 = new Text();
Thread t1 = new Thread(text1);
text1.setPanduan(true);
t1.start();
Thread.sleep(2000);
t1.interrupt();
text1.setPanduan(false);

Text text2 = new Text();
Thread t2 = new Thread(text2);
text2.setPanduan(true);
t2.start();
}
}

#2


首先,每个线程内部都有一个boolean型变量表示线程的中断状态,true代表线程处于中断状态,false表示未处于中断状态。

而interrupt()方法的作用只是用来改变线程的中断状态(把线程的中断状态改为true,即被中断)。

A线程调用wait,sleep,join方法,这时B线程调用了A的interrupt方法而抛出的InterruptedException是wait,sleep,join方法内部不断检查中断状态的值,自己抛出来的,并不是直接由interrupt方法直接引起的。
抛出InterruptedException以后,线程又会回到非中断状态(false)。

因此interrupt()方法代表着外界希望中断此线程,只是希望,具体怎么处理还是线程内部来做,一般情况下interrupt()方法可以使处于阻塞状态的线程抛出InterruptedException从而结束阻塞状态。

#3


Thread.sleep(2000);
t0.interrupt();
这个是在主线程里面执行的,共3个线程使用CPU资源,随机执行其中一个,那个main线程有可能就执行不到

#5


引用 1 楼  的回复:
public class Text implements Runnable {
boolean panduan = false;
public boolean isPanduan() {
return panduan;
}
public void setPanduan(boolean panduan) {
this.panduan = panduan;
}
public void……

运行成功

#1


public class Text implements Runnable {
boolean panduan = false;
public boolean isPanduan() {
return panduan;
}
public void setPanduan(boolean panduan) {
this.panduan = panduan;
}
public void run() {
while (panduan) {
System.out.println(Thread.currentThread().getName());
}
}
public static void main(String[] args) throws InterruptedException {
Text text1 = new Text();
Thread t1 = new Thread(text1);
text1.setPanduan(true);
t1.start();
Thread.sleep(2000);
t1.interrupt();
text1.setPanduan(false);

Text text2 = new Text();
Thread t2 = new Thread(text2);
text2.setPanduan(true);
t2.start();
}
}

#2


首先,每个线程内部都有一个boolean型变量表示线程的中断状态,true代表线程处于中断状态,false表示未处于中断状态。

而interrupt()方法的作用只是用来改变线程的中断状态(把线程的中断状态改为true,即被中断)。

A线程调用wait,sleep,join方法,这时B线程调用了A的interrupt方法而抛出的InterruptedException是wait,sleep,join方法内部不断检查中断状态的值,自己抛出来的,并不是直接由interrupt方法直接引起的。
抛出InterruptedException以后,线程又会回到非中断状态(false)。

因此interrupt()方法代表着外界希望中断此线程,只是希望,具体怎么处理还是线程内部来做,一般情况下interrupt()方法可以使处于阻塞状态的线程抛出InterruptedException从而结束阻塞状态。

#3


Thread.sleep(2000);
t0.interrupt();
这个是在主线程里面执行的,共3个线程使用CPU资源,随机执行其中一个,那个main线程有可能就执行不到

#4


#5


引用 1 楼  的回复:
public class Text implements Runnable {
boolean panduan = false;
public boolean isPanduan() {
return panduan;
}
public void setPanduan(boolean panduan) {
this.panduan = panduan;
}
public void……

运行成功