让所有子线程执行完父线程再执行,有哪几种实现方式

本文介绍了Java中Thread类的join()方法、CountDownLatch的计数机制、CyclicBarrier的同步屏障功能以及Future在异步计算中的使用,对比了它们在控制多线程协作和同步方面的特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Thread类的join()

让当前线程等待join线程执行结束

【原理】:当前线程不停检查join线程是否存活存活一直等待否则调用this.notifyAll() 通知当前线程

CountDownLatch

设置count初值,每一个子线程完成就减一,直至减为0表示所有子线程执行完成,count不支持重置,即一次性使用

【原理】:父线程调用await()方法(可以指定等待时间)进入等待状态直至count=0

CyclicBarrier

设置屏障需要拦截的线程数量到达屏障线程调用await()方法表明达到屏障,并进入等待状态。屏障减为0,表明目标数量的线程都到了然后调用notifyAll()通知所有线程

【与CountDownLatch的区别】:可以用reset()重置资源数,并且可以实现更复杂的场景:如 cyclicBarrier提供一种构造函数用于线程到达屏障时优先执行Runnable barrierAction,可用于并行统计然后汇总计算的场景。

Future

线程池使用submit提交,会返回future_task,当任务完成后会返回结果,可以调用future.get()获取异步计算的结果(或异常),该方法是一个阻塞方法,结果尚未返回会阻塞当前线程执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值