Java中子线程能否存活超过主线程?实际代码表现存疑
为什么Java主线程结束后子线程还在运行?
嘿,我来帮你理清这个常见的误区~
你之前的认知“子线程不会比主线程存活更久”其实是只适用于守护线程(Daemon Thread),而Java里默认创建的线程都是用户线程(User Thread),这两者的行为有本质区别:
- 用户线程:是JVM必须等待其执行完成才会退出的线程。哪怕创建它的主线程已经结束,只要还有用户线程在运行,JVM就会继续保持存活状态,直到所有用户线程执行完毕。
- 守护线程:是依赖于创建它的线程的“后台线程”。当所有用户线程都结束后,JVM会自动终止所有守护线程,不管它们有没有执行完。
回到你的代码,你创建的NewThread应该是一个默认的用户线程(比如在它的构造方法里调用了start()),所以当主线程睡1秒后输出并结束时,这个子线程作为用户线程会继续运行,直到自己的任务完成。
如果想让子线程随主线程一起结束,你需要把它设置为守护线程,示例代码如下:
public class Main { public static void main(String[] args) { // 创建子线程实例 Thread childThread = new NewThread(); // 设置为守护线程,必须在start()之前调用! childThread.setDaemon(true); // 启动线程 childThread.start(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("\nThis is main thread finishing..."); } } class NewThread extends Thread { @Override public void run() { // 模拟子线程的长时间任务 for (int i = 0; i < 10; i++) { try { Thread.sleep(500); System.out.println("子线程正在运行:" + i); } catch (InterruptedException e) { e.printStackTrace(); } } } }
运行上面的代码你会发现,主线程结束后,子线程(守护线程)会被JVM强制终止,不会继续输出后续内容。
最后再划个重点:
- 线程的守护属性必须在调用
start()方法之前设置,之后再调用setDaemon()会抛出IllegalThreadStateException - 不要在守护线程里执行需要保证完成的任务(比如文件写入、数据库操作),因为它可能随时被终止
内容的提问来源于stack exchange,提问作者securecurve
相关产品推荐
相关产品推荐

