CountDownLatch通过计数器控制线程执行顺序,初始化指定计数值,调用countDown()减1,await()阻塞等待计数归零。示例中Thread C等待A、B完成后再执行,确保任务顺序。注意事项包括计数器不可重置、需保证countDown()调用次数与初始值一致,适用于一组操作完成后触发后续动作的场景。

在Java中,CountDownLatch 是一种非常实用的并发工具类,位于 java.util.concurrent 包下,可以用来控制多个线程的执行顺序。它通过一个计数器实现:当计数器为0时,所有被阻塞的线程才会继续执行。这使得我们可以让一个或多个线程等待其他线程完成任务后再开始。
1. CountDownLatch 的基本原理
CountDownLatch 初始化时指定一个计数值(正整数),调用 countDown() 方法会将计数减1,而 await() 方法会让当前线程阻塞,直到计数变为0。
countDown():由工作线程调用,表示完成一项任务。 await():由等待线程调用,等待所有前置任务完成。
2. 控制线程执行顺序的典型场景
假设我们有三个线程:Thread A、B 和 C,要求 A 和 B 必须在 C 执行之前完成。我们可以使用 CountDownLatch 实现这个需求。
示例代码:
立即学习“Java免费学习笔记(深入)”;
import java.util.concurrent.CountDownLatch;public class ThreadOrderExample { public static void main(String[] args) { // 设置计数器为2,表示等待两个线程完成 CountDownLatch latch = new CountDownLatch(2); Thread threadA = new Thread(() -> { System.out.println("Thread A 正在执行"); try { Thread.sleep(1000); } catch (InterruptedException e) {} System.out.println("Thread A 执行完毕"); latch.countDown(); // 计数减1 }); Thread threadB = new Thread(() -> { System.out.println("Thread B 正在执行"); try { Thread.sleep(1500); } catch (InterruptedException e) {} System.out.println("Thread B 执行完毕"); latch.countDown(); // 计数减1 }); Thread threadC = new Thread(() -> { System.out.println("Thread C 等待 A 和 B 完成..."); try { latch.await(); // 阻塞,直到计数为0 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Thread C 开始执行"); }); // 启动线程(顺序可任意) threadC.start(); threadA.start(); threadB.start(); }}
输出结果大致如下:
Thread C 等待 A 和 B 完成...Thread A 正在执行Thread B 正在执行Thread A 执行完毕Thread B 执行完毕Thread C 开始执行
可以看到,尽管 threadC 先启动,但它会等待 A 和 B 都调用 countDown() 后才继续执行。
3. 使用注意事项
CountDownLatch 的计数器不能重置,一旦变为0,后续调用 await() 将立即返回。 适用于“**等一组操作完成**”的场景,比如资源初始化、多任务并行处理后的汇总等。 如果需要重复使用,应考虑使用 CyclicBarrier。 确保 countDown() 被调用的次数与初始计数一致,否则可能造成死锁。
基本上就这些。CountDownLatch 不复杂但容易忽略细节,正确使用能有效协调线程执行顺序。
以上就是Java中如何使用CountDownLatch控制线程执行顺序的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/203234.html
微信扫一扫
支付宝扫一扫