如何更好的结束线程
在java中,每段线程都是运行了不同的任务,可能有的线程刚执行了任务,有的线程任务已经执行了一半了,后者有的任务执行快要结束了,所以线程的关闭需要考虑到各种情况,不是简单的使用stop()、destory()等方法
最优方案是让其运行完(也就是方法执行完毕),干净地释放掉所有资源,然后退出。如果是一个不断循环运行的线程,就需要用到线程间的通信机制,让主线程通知其退出
这里有个概念,daemon线程和非daemon线程
daemom线程的生命周期依附于主线程,当主线程执行完毕,daemom无论业务逻辑是否执行完毕,都会马上终止,通过使用Thread.setDaemon(true)将线程设置为守护线程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | package com.java.test.daemom; import lombok.extern.slf4j.Slf4j; /** * @Description: * @Author: Yourheart * @Create: 2022/10/30 21:29 */ @Slf4j public class DaeMomThreadDemo extends Thread { @Override public void run() { while ( true ){ String name = Thread.currentThread().getName(); log.info( "【守护线程】name:{}" ,name); try { Thread.sleep( 500 ); } catch (InterruptedException e) { e.printStackTrace(); } } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | package com.java.test.daemom; import lombok.extern.slf4j.Slf4j; /** * @Description: * @Author: Yourheart * @Create: 2022/10/30 21:32 */ @Slf4j public class ThreadDemo extends Thread { @Override public void run() { for ( int i = 0 ; i < 10 ; i++) { log.info( "非Daemon线程" ); try { Thread.sleep( 500 ); } catch (InterruptedException e) { e.printStackTrace(); } } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | package com.java.test.daemom; /** * @Description: * @Author: Yourheart * @Create: 2022/10/30 21:28 */ public class ThreadTest { public static void main(String[] args) { DaeMomThreadDemo daeMomThreadDemo= new DaeMomThreadDemo(); daeMomThreadDemo.setDaemon( true ); daeMomThreadDemo.start(); new ThreadDemo().start(); } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律