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();
}
}
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从而结束阻塞状态。
而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线程有可能就执行不到
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 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();
}
}
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从而结束阻塞状态。
而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线程有可能就执行不到
t0.interrupt();
这个是在主线程里面执行的,共3个线程使用CPU资源,随机执行其中一个,那个main线程有可能就执行不到
#4
#5
运行成功