如何终止一个线程
终止一个线程早期Thread来时提供对应的停止方法的,比如stop等,但是到后这个停止一个线程的api都已经过时了,即存在风险,不推荐使用,拿如果碰到这种线程停止的需求如何实现, 且是优雅的实现,🆗 , 那么两个阶段终止的意思就是, 第一阶段时准备停止阶段,第二阶段时停止阶段。思路就是 B线提供一个一个标志,如果别的线程把这个标志设计为true,那么当前线程就终止。
实现如下
/**
*
* @Author: puhaiguo
* @Date: 2022-07-13 21:32
* @Version 1.0
*/
public class BThread extends Thread{
private volatile boolean flag = false;
public void setFlag(boolean flag) {
this.flag = flag;
}
@Override
public void run() {
while (true){
if (flag) break;
//todo
try {
TimeUnit.SECONDS.sleep(1);
System.out.println(" 今天天气真热 ");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
/**
*
* @Author: puhaiguo
* @Date: 2022-07-13 21:34
* @Version 1.0
*/
public class Test {
public static void main(String[] args) throws InterruptedException {
BThread bThread = new BThread();
bThread.start();
TimeUnit.SECONDS.sleep(4);
bThread.setFlag(true);
}
}
改进
有问题吗,思考这样,如果Bthread sleep 或者 wait了,那么别的线程设置了停止标志位true也没用咯, sleep和wait时可以响应中断的,那么改进方式如下:
/**
*
* @Author: puhaiguo
* @Date: 2022-07-13 21:32
* @Version 1.0
*/
public class BThread extends Thread{
private volatile boolean flag = false;
public void setFlag(boolean flag) {
this.flag = flag;
/*中断当前线程*/
this.interrupt();
}
@Override
public void run() {
while (true){
if (flag) break;
//todo
try {
TimeUnit.SECONDS.sleep(100);
System.out.println(" 今天天气真热 ");
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
//todo
}
}
}
}
总结
呃 这里时继承的Thread的,所以this就代表当前线程,因此可以这么this.inthruput
如果时使用runnable的方式,如何中断呢?
需要把Thread的对象接住
而不能像一下这样:
public void setFlag(boolean flag) {
this.flag = flag;
Thread.currentThread().interrupt();
}
因为 Thread.currentThrad()获取的是调用setFlag的线程对象,而不是想要中断的线程对象。