首页
登录 | 注册

Java多线程之停止一个线程

注:本文主要参考《Java多线程编程核心技术》高洪岩


方法一:利用MyThread.interrupt()与break


public class MyThread extends Thread{

@Override
public void run() {
for(int i=0;i<1e5;i++){
if(this.interrupted()){
System.out.println("MyThread interrupted");
break;  //会直接跳到for循环外面,继续执行for循环外面的代码
}
System.out.println("i= "+i);
}
}

}


public class Main {
public static void main(String[] args) throws InterruptedException{
MyThread myThread=new MyThread();
myThread.start();
Thread.sleep(1000);
myThread.interrupt();
}

}


运行结果:

i=0

.......

i= 27195
i= 27196
i= 27197
i= 27198
MyThread interrupted   //表明该线程被正确停止了。


方法二:利用MyThread.interrupt()与return

如果出现下面代码:

public class MyThread extends Thread{

@Override
public void run() {
for(int i=0;i<1e5;i++){
if(this.interrupted()){
System.out.println("MyThread interrupted");
break;
}
System.out.println("i= "+i);
}

//for循环外面还有代码,当收到中断线程的指令后,break跳出

//for循环,本线程继续执行for循环外面的代码;
System.out.println("执行for循环外面的代码");
}

}

执行结果:

i=0

.......


i= 26231
i= 26232
MyThread interrupted
执行for循环外面的代码


解决办法如下:

public class MyThread extends Thread{

@Override
public void run() {
for(int i=0;i<1e5;i++){
if(this.interrupted()){
System.out.println("MyThread interrupted");
return;   //利用return直接终止run方法
}
System.out.println("i= "+i);
}
System.out.println("执行for循环外面的代码");
}

}

执行结果如下:

i=0

.......


i= 37716
i= 37717
i= 37718
MyThread interrupted


方法三:利用throw new InterruptedException(),抛出异常的方法

public class MyThread extends Thread{

@Override
public void run() {
try {
for (int i = 0; i < 1e5; i++) {
if (this.interrupted()) {
System.out.println("MyThread interrupted");
throw new InterruptedException();
}
System.out.println("i= " + i);
}
System.out.println("执行for循环外面的代码");
} catch (InterruptedException e) {
System.out.println("has catched InterruptedException");
//e.printStackTrace();
}
}

}


执行结果如下:

i=0

.......


i= 37979
i= 37980
i= 37981
i= 37982
MyThread interrupted
has catched InterruptedException


注:据高洪岩老师所说,通过抛出异常来中断线程是最合适的办法,不过,上述三种方法都有自己的适用性,抛出异常的方法,适用性最广,我们也可以在catch字句中做很多事情,比如保存数据,发出警告,通知用户等。



2020 jeepxie.net webmaster#jeepxie.net
10 q. 0.008 s.
京ICP备10005923号