如何更好的结束线程
在java中,每段线程都是运行了不同的任务,可能有的线程刚执行了任务,有的线程任务已经执行了一半了,后者有的任务执行快要结束了,所以线程的关闭需要考虑到各种情况,不是简单的使用stop()、destory()等方法
最优方案是让其运行完(也就是方法执行完毕),干净地释放掉所有资源,然后退出。如果是一个不断循环运行的线程,就需要用到线程间的通信机制,让主线程通知其退出
这里有个概念,daemon线程和非daemon线程
daemom线程的生命周期依附于主线程,当主线程执行完毕,daemom无论业务逻辑是否执行完毕,都会马上终止,通过使用Thread.setDaemon(true)将线程设置为守护线程
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(); } } } }
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(); } } } }
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(); } }