java 两阶段终止线程的正确做法

网友投稿 254 2022-09-09


java 两阶段终止线程的正确做法

目录一、怎么优雅地关闭一个线程?1.错误做法2.正确做法二、要点

一、怎么优雅地关闭一个线程?

在一个线程T1中如何优雅地关闭线程T2(也就是说要给T2一个机会释放持有的资源)?

1.错误做法

使用stop()方法停止线程:

stop()方法会真正杀死线程,如果此时该线程持有锁,那么其他线程将永远无法获取锁。

使用System.exit()方法停止线程:

会让整个进程都退出

2.正确做法

思路:

代码实现:

public class Test {

public static void main(String[] args) throws InterruptedException {

TwoPhaseTermination twoPhaseTermination = new TwoPhaseTermination();

twoPhaseTermination.start();

Thread.sleep(3000);

twoPhaseTermination.stop();

}

}

class TwoPhaseTermination{

// 监控线程

private Thread monitorThread;

public void start(){

monitorThread = new Thread(()->{

Thread current = Thread.currentThread();

while(true){

if(current.isInterrupted()){

System.out.println("线程要关闭了...");

break;

}

try {

Thread.sleep(1000); /http:/// 阶段1

System.out.println("监控线程正在工作...."); // 阶段2

// 如果在阶段2被打断,线程的isInterrupted标志位为true,会捕抓到信号并关闭线程

// 如果在阶段1被打断,会进入catch语句块,并且isInterrupted标志位清空,无法关闭线程

} catch (InterruptedException e) {

e.printStackTrace();

// 需要重新设置isInterrupted标志位为true

monitorThread.interrupt();

}

}

});

// 启动线程

monitorThread.start();

}

public void stop(){

// 设置isInterrupted标志位true

monitorThread.interrupt();

}

}

运行结果:

两阶段关闭线程:

二、要点

为什么需要在catch代码块中重新执行monitorThread.interrupt()?因为Thread.sleep()执行过程中被打断,isInterrupted标志位会清空,下一次进入while循环就会忽略这次打断,继续运行线程。

演lXNfZc示一下把monitorThread.interrupt()注释掉的结果:

可以看到,会忽略这次的isInterrupted信号,继续运行线程。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:TCP 复位gongji原理和实战复现(tcp/ip协议包含哪几层)
下一篇:如何一键修改软件默认安装路径?简单又省事~(如何修改软件安装的默认路径)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~