You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

子线程执行完毕后主线程执行逻辑疑问及代码运行结果咨询

关于Java线程执行的两个问题解答

问题1:子线程完成执行后,是否会恢复执行主线程的代码行?

完全不会哦!Java里的每个线程都是独立的执行流,主线程和子线程各自按自己的代码顺序跑,彼此之间没有“子线程结束后触发主线程重复执行某段代码”的默认机制。主线程的代码只会从上到下顺次执行一遍,除非你主动用循环、递归这类控制逻辑让它重复,否则子线程的结束根本不会影响主线程的执行路径。

问题2:为什么我的主线程只执行了最后两行代码一次?

先拆解下你这段代码的实际执行流程:

  1. 主线程创建t1子线程,调用t1.start()——这一步只是启动子线程,主线程不会等子线程执行完,而是立刻继续往下走。
  2. 主线程打印休眠提示,然后进入5秒的休眠。
  3. 在主线程休眠的这段时间里,子线程会快速执行完run()方法里的打印语句,然后子线程就结束了。
  4. 主线程休眠结束后,继续执行后面的两行打印代码,然后主线程结束,整个程序退出。

你的预期其实是错误的,因为:

  • 主线程的代码是顺序执行的,Thread.sleep(5000)之后的两行代码,在主线程的执行流程里只会走一次,子线程的结束不会让主线程回头重新执行它们。
  • 如果你想让主线程等子线程结束后再执行某些操作,可以用t1.join()让主线程等待子线程完成,但这也只是让主线程“等一等再继续往下走”,不是重复执行代码。如果确实需要重复执行那两行,得主动加循环逻辑,比如这样修改代码:
public class test {
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("In normal child thread " + Thread.currentThread().getName());
            }
        });
        t1.start();
        // 让主线程等待子线程执行完毕
        t1.join();
        System.out.println("main thread resumed after child thread finished : " + Thread.currentThread().getName());
        // 用循环实现重复执行
        for (int i = 0; i < 3; i++) {
            System.out.println("In main thread : " + Thread.currentThread().getName());
            System.out.println("exiting main thread : " + Thread.currentThread().getName());
        }
    }
}

这段代码里,t1.join()会让主线程暂停,直到子线程完全结束,之后主线程会进入循环,重复打印你想要的那两行代码3次。

内容的提问来源于stack exchange,提问作者vinod hy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 19:32:34