并发工具类

上一篇:线程池 · 下一篇: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();
CountDownLatchCyclicBarrier
等待方一个等多个多个互相等
重用
计数countDownawait 到达

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。

文章目录

文章目录