Java中线程start后即使运行结束也不能再次start

本文探讨了Java中线程启动(start)方法的使用限制。一旦线程启动并完成执行后,该线程不能被再次启动。文章通过实例解析了这一行为,并引用相关资料解释原因。
Java 中,主线程(main thread)的生命周期并不依赖于子线程。这意味着,如果主线程执行完毕,即使还有子线程运行,JVM 也不会自动等待这些子线程完成,而是直接退出,除非这些子线程是非守护线程(non-daemon thread)。当 JVM 中只剩下守护线程时,JVM 才会退出[^2]。 ### 主线程与子线程的执行顺序 Java 的多线程是并发执行的,主线程和子线程之间没有默认的同步机制来保证执行顺序。如果不加额外控制,主线程可能在子线程完成之前就结束执行。 ### 示例代码 以下代码演示了主线程不等待子线程的情况: ```java public class MainThreadWait { public static void main(String[] args) { Thread childThread = new Thread(() -> { try { System.out.println("子线程开始执行"); Thread.sleep(3000); // 模拟耗时操作 System.out.println("子线程执行完毕"); } catch (InterruptedException e) { e.printStackTrace(); } }); childThread.start(); // 启动子线程 System.out.println("主线程执行完毕"); } } ``` **输出结果**(顺序可能不同): ``` 主线程执行完毕 子线程开始执行 子线程执行完毕 ``` 可以看到,主线程在子线程完成之前就已经结束。 ### 强制主线程等待子线程 如果希望主线程等待子线程执行完毕再结束,可以使用 `join()` 方法: ```java public class MainThreadWait { public static void main(String[] args) throws InterruptedException { Thread childThread = new Thread(() -> { try { System.out.println("子线程开始执行"); Thread.sleep(3000); // 模拟耗时操作 System.out.println("子线程执行完毕"); } catch (InterruptedException e) { e.printStackTrace(); } }); childThread.start(); // 启动子线程 childThread.join(); // 主线程等待子线程结束 System.out.println("主线程执行完毕"); } } ``` **输出结果**(顺序固定): ``` 子线程开始执行 子线程执行完毕 主线程执行完毕 ``` 此时,主线程会等待子线程执行完毕后再继续执行。 ### 守护线程的影响 如果将子线程设置为守护线程,当主线程执行完毕,JVM 会直接退出,不会等待守护线程完成: ```java public class DaemonThreadExample { public static void main(String[] args) { Thread daemonThread = new Thread(() -> { try { System.out.println("守护线程开始执行"); Thread.sleep(3000); System.out.println("守护线程试图执行完毕"); } catch (InterruptedException e) { e.printStackTrace(); } }); daemonThread.setDaemon(true); // 设置为守护线程 daemonThread.start(); System.out.println("主线程执行完毕"); } } ``` **输出结果**(可能只有前两行): ``` 守护线程开始执行 主线程执行完毕 ``` 守护线程未执行完就被 JVM 强制终止。 ### 总结 - Java线程默认不会等待子线程执行完毕。 - 使用 `join()` 可以实现主线程等待子线程。 - 守护线程在主线程结束后不会阻止 JVM 退出
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值