如何正确停止Java线程,终止Java线程的三种方法
【原创,转载请注明出处】
我的 【博客园主页】 【CSDN主页】 【简书主页】
加V进Java交流群,备注Java交流:w1129574379
在 Java 中有以下 3 种方法可以终止正在运行的线程:
- 使用退出标志,使线程正常退出,也就是当 run() 方法完成后线程终止。
- 使用 stop() 方法强行终止线程,但不推荐,该方法已被弃用,原因见后文。
- 使用 interrupt 方法中断线程。
以下内容翻译自 JDK1.5官方文档 ,内容有微调。未发现JDK1.8对应文档与JDK1.5的内容有明显不同。
停止一个线程的推荐做法
stop
的大多数用法应由简单地修改某些变量以指示目标线程应停止运行的代码代替。 目标线程应定期检查此变量,如果该变量指示要停止运行,则应有序地从其运行方法返回。 (这是Java始终推荐的方法)。为了确保对stop-request
进行及时的通信,变量必须是volatile
(或必须同步访问变量)。
例如,假设您的程序包含以下start
,stop
和run
方法:
private Thread blinker;
public void start() {
blinker = new Thread(this);
blinker.start();
}
public void stop() {
blinker.stop(); // UNSAFE!
}
public void run() {
Thread thisThread = Thread.currentThread();
while (true) {
try {
thisThread.sleep(interval);
} catch (InterruptedException e){
}
repaint();
}
}
可以通过将程序的stop和run方法替换为下面的代码来避免使用Thread.stop
:
private volatile Thread blinker;
public void stop() {
blinker = null;
}
public