作者简介:大家好,我是码炫码哥,前中兴通讯、美团架构师,现任某互联网公司CTO,兼职码炫课堂主讲源码系列专题
代表作:《jdk源码&多线程&高并发》,《深入tomcat源码解析》,《深入netty源码解析》,《深入dubbo源码解析》,《深入springboot源码解析》,《深入spring源码解析》,《深入redis源码解析》等
联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬。码炫课堂的个人空间-码炫码哥个人主页-面试,源码等
回答
在 Java 中要终止一个正在运行的线程,有三种方法:
- 使用退出标志。使用一个标志变量来控制线程是否正常退出任务。线程的主循环不断检测这个变量,当变量标志为停止时,线程安全退出。
- 利用中断机制。调用线程的
interrupt()
来控制线程中断。 - 强制退出。调用线程的
stop()
强行终止线程,不推荐这种方法,
详解
使用退出标志
当我们使用轮询或者调用第三方库失败需要不断重试时,这些类似的场景大部分都存在类似一个这样的循环体 while(true) { ... }
,一般这种场景就比较适合实用退出标志来结束线程的运行。
具体方法是:设置一个 volatile 修饰的共享变量,当变量为 true 时线程正常运行,当需要中断时,将该共享变量设置为 false。代码如下: