在一个线程t1中如何优雅地关闭线程t2(也就是说要给t2一个机会释放持有的资源)?
使用stop()方法停止线程:
stop()
方法会真正杀死线程,如果此时该线程持有锁,那么其他线程将永远无法获取锁。
使用system.exit()方法停止线程:
会让整个进程都退出
思路:
代码实现:
public class test { public static void main(string[] args) throws interruptedexception { twophatermination twophatermination = new twophatermination(); twophatermination.start(); thread.sleep(3000); twophatermination.stop(); }}class twophatermination{ // 监控线程 private thread monitorthread; public void start(){ monitorthread = new thread(()->{ thread current = thread.currentthread(); while(true){ if(current.i广东大专院校sinterrupted()){ system.out.println("线程要关闭了..."); break; } try { thread.sleep(1000); // 阶段1 是否统招 system.out.println("监控线程正在工作...."); // 阶段2 // 如果在阶段2被打断,线程的isinterrupted标志位为true,会捕抓到信号并关闭线程 // 如果在阶段1被打断,会进入catch语句块,并且isinterrupted标志位清空,无法关闭线程 献媚取宠 } catch (i向量点积nterruptedexception e) { e.printstacktrace(); // 需要重新设置isinterrupted标志位为true monitorthread.interrupt(); } } }); // 启动线程 monitorthread.start(); } public void stop(){ // 设置isinterrupted标志位true monitorthread.interrupt(); }}
运行结果:
两阶段关闭线程:
为什么需要在catch代码块中重新执行monitorthread.interrupt()?
因为thread.sleep()
执行过程中被打断,isinterrupted标志位会清空,下一次进入while
循环就会忽略这次打断,继续运行线程。
演示一下韩国明星同款把monitorthread.interrupt()注释掉的结果:
可以看到,会忽略这次的isinterrupted信号,继续运行线程。
到此这篇关于java 两阶段终止线程的正确做法的文章就介绍到这了,更多相关java 两阶段终止线程内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!
本文发布于:2023-04-04 02:34:50,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/b879b545729f7974f7c14d32d4eeae12.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:java 两阶段终止线程的正确做法.doc
本文 PDF 下载地址:java 两阶段终止线程的正确做法.pdf
留言与评论(共有 0 条评论) |