上一篇:线程池 · 下一篇:ThreadLocal
CountDownLatch — 一次性倒计时
主线程等待 N 个子任务完成:
CountDownLatch latch = new CountDownLatch(3);for (int i = 0; i < 3; i++) { pool.execute(() -> { try { work(); } finally { latch.countDown(); } });}latch.await(); // 阻塞直到计数为 0- 计数减到 0 后 不可重用
- 可
await(timeout, unit)限时等待
CyclicBarrier — 可重用栅栏
N 个线程互相等到齐再一起继续;可带 Runnable barrierAction 在到齐后执行一次。
CyclicBarrier barrier = new CyclicBarrier(3, () -> System.out.println("all arrived"));// 每个线程 barrier.await();| CountDownLatch | CyclicBarrier | |
|---|---|---|
| 等待方 | 一个等多个 | 多个互相等 |
| 重用 | 否 | 是 |
| 计数 | countDown | await 到达 |
Semaphore — 限流
控制同时访问资源的线程数(如限制 3 个并发):
Semaphore sem = new Semaphore(3);sem.acquire();try { // 最多 3 个线程在此} finally { sem.release();}ForkJoinPool
分治:大任务 fork 子任务,join 合并。适合 CPU 密集、可递归拆分(如数组求和)。
ForkJoinPool pool = ForkJoinPool.commonPool();// RecursiveTask / RecursiveAction注意:拆分过细 → 线程过多;调用栈过深 → 栈溢出风险。
FutureTask
包装 Callable,既是 Future 又是 Runnable,可提交线程池或 new Thread(ft)。
一句话总结
等子任务完成用 CountDownLatch;多线程到齐再出发用 CyclicBarrier;限并发用 Semaphore;大任务分治用 ForkJoin。