基于白嫖黑马程序员白嫖视频:全面深入学习java并发编程,java基础进阶中级必会教程
1 场景
在T1线程中如何“优雅”终止线程T2。
2 流程图
3 实现1
Thread thread = new Thread() {
@Override
public void run() {
//持续运行
while (true) {
//被打断
Thread current = Thread.currentThread();
if (current.isInterrupted()) {
System.out.println("料理后事");
break;
}
//没有被打断
try {
Thread.sleep(1000);//sleep让出cpu时间
System.out.println("正常执行任务");
} catch (InterruptedException e) {
//对于sleep时被打断会捕捉这个异常,自己改变isInterrupted为true
current.interrupt();
}
}
}
};
4 实现2(volatile)
//设置一个退出的变量
private static volatile boolean stop = false;//是否退出,注意关键字volatile
public static void main(String[] args) {
Thread thread = new Thread() {
@Override
public void run() {
//持续运行
while (true) {
//被打断
Thread current = Thread.currentThread();
if (stop) {
System.out.println("料理后事");
break;
}
//没有被打断
try {
Thread.sleep(1000);//sleep让出cpu时间
System.out.println("正常执行任务");
} catch (InterruptedException e) {
//对于sleep时被打断会捕捉这个异常,自己改变isInterrupted为true
current.interrupt();
}
}
}
};
}
实现1有两种退出出口,即在不同的位置调用interrupt()。但是实现2别人调用只用设置stop布尔值变量即可实现退出,其实原理一样,只是实现2没有在sleep打断的这一种情况,鲁棒性较好。
5 总结
所谓的两阶段终止,指的是可能在sleep阶段被终止和可能在执行任务期间被终止;对于执行任务期间,isInterrupted被设置为true,下一次循环的时候就执行“料理后事”代码;对于sleep期间被终止,马上进入catch块,但是isInterrupted还是false,需要自己执行一次中断操作current.interrupt()。
版权声明:本文为weixin_44215363原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。