Java多个子线程都执行完后,再执行主线程

本文分享了一位面试者在找工作过程中遇到的一个关于Java多线程的问题:如何确保所有子线程执行完毕后再执行主线程。文章详细介绍了作者在面试后通过查阅资料找到的答案,并附上了测试代码及结果。

最近找工作面试官问了我一个关于多线程的问题:Java多个子线程都执行完后,再执行主线程
当时没有答出来,回来百度了一下然后看了线程的源码,找到了答案。然后自己备注下,以后用。
java.lang.Thread中
这里写图片描述
测试代码及结果
这里写图片描述

让子线程等待主线程执行完后继续执行,有以下几种常见的方法: ### 使用 `CountDownLatch` `CountDownLatch` 是一个同步辅助类,它允许一个线程等待其他线程完成操作。可以将计数器初始化为 1,主线程执行完后调用 `countDown()` 方法,子线程调用 `await()` 方法等待计数器归零。 ```java import java.util.concurrent.CountDownLatch; public class MainThreadFirst { public static void main(String[] args) throws InterruptedException { CountDownLatch latch = new CountDownLatch(1); Thread childThread = new Thread(() -> { try { // 子线程等待主线程完成 latch.await(); System.out.println("子线程开始执行"); } catch (InterruptedException e) { e.printStackTrace(); } }); childThread.start(); // 主线程执行任务 System.out.println("主线程开始执行"); Thread.sleep(2000); System.out.println("主线程执行完毕"); // 主线程完成后,计数器减 1 latch.countDown(); } } ``` ### 使用 `CyclicBarrier` `CyclicBarrier` 也可以用于线程间的同步。可以设置一个屏障,当主线程执行完后,调用 `await()` 方法,子线程也调用 `await()` 方法,当所有线程都到达屏障时,它们会继续执行。 ```java import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; public class MainThreadFirstWithCyclicBarrier { public static void main(String[] args) { CyclicBarrier barrier = new CyclicBarrier(2); Thread childThread = new Thread(() -> { try { // 子线程等待主线程完成 barrier.await(); System.out.println("子线程开始执行"); } catch (InterruptedException | BrokenBarrierException e) { e.printStackTrace(); } }); childThread.start(); // 主线程执行任务 System.out.println("主线程开始执行"); try { Thread.sleep(2000); System.out.println("主线程执行完毕"); // 主线程完成后,到达屏障 barrier.await(); } catch (InterruptedException | BrokenBarrierException e) { e.printStackTrace(); } } } ``` ### 使用 `Semaphore` `Semaphore` 可以用来控制同时访问特定资源的线程数量。可以将信号量初始化为 0,主线程执行完后释放一个许可,子线程获取许可后继续执行。 ```java import java.util.concurrent.Semaphore; public class MainThreadFirstWithSemaphore { public static void main(String[] args) { Semaphore semaphore = new Semaphore(0); Thread childThread = new Thread(() -> { try { // 子线程等待主线程释放许可 semaphore.acquire(); System.out.println("子线程开始执行"); } catch (InterruptedException e) { e.printStackTrace(); } }); childThread.start(); // 主线程执行任务 System.out.println("主线程开始执行"); try { Thread.sleep(2000); System.out.println("主线程执行完毕"); // 主线程完成后,释放一个许可 semaphore.release(); } catch (InterruptedException e) { e.printStackTrace(); } } } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dev_Arno

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值