子线程执行完毕后主线程执行逻辑疑问及代码运行结果咨询
关于Java线程执行的两个问题解答
问题1:子线程完成执行后,是否会恢复执行主线程的代码行?
完全不会哦!Java里的每个线程都是独立的执行流,主线程和子线程各自按自己的代码顺序跑,彼此之间没有“子线程结束后触发主线程重复执行某段代码”的默认机制。主线程的代码只会从上到下顺次执行一遍,除非你主动用循环、递归这类控制逻辑让它重复,否则子线程的结束根本不会影响主线程的执行路径。
问题2:为什么我的主线程只执行了最后两行代码一次?
先拆解下你这段代码的实际执行流程:
- 主线程创建
t1子线程,调用t1.start()——这一步只是启动子线程,主线程不会等子线程执行完,而是立刻继续往下走。 - 主线程打印休眠提示,然后进入5秒的休眠。
- 在主线程休眠的这段时间里,子线程会快速执行完
run()方法里的打印语句,然后子线程就结束了。 - 主线程休眠结束后,继续执行后面的两行打印代码,然后主线程结束,整个程序退出。
你的预期其实是错误的,因为:
- 主线程的代码是顺序执行的,
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
相关产品推荐
相关产品推荐

