1. CyclicBarrier : 初始化count是固定的, 通常用于多个线程同时等待彼此,当所有线程到达某一点时,同时继续进行。
例子:
Int N = 3; final CyclicBarrier cb = new CyclicBarrier(N); for (int i = 0; i < N; i++) { new Thread(new Runnable() { public void run() { Do xxx; cb.await(); //等3个进程同时到达时,才会继续。 }).start(); }
2. CountdownLatch: 一次性的,初始化count是固定的,通常用于主线程等待一堆子线程的完成。
例子:
final CountDownLatch cdl = new CountDownLatch(N); new Thread(new Runnable() { public void run() { cdl.await(); } }).start(); for (int i = 0; i < N; i++) { final int idx = i; new Thread(new Runnable() { public void run() { cdl.countDown(); } }).start(); }
3. Semaphor:就像是一个计数器,调用Release()时增加,调用acquire时减少,如果acquire的数量不足,则等待。
例子:
public class SemaphoreTest { private static final int MAX_THREADS = 5; public static void main(String[] args) throws Exception { Semaphore semaphore = new Semaphore(0); int threadCount = 0; Random random = new Random(); for(int i=0;i<MAX_THREADS;i++) { Thread t = new Thread(new WorkerThread(semaphore, String.format("Thread-%d", i))); t.start(); threadCount++; } semaphore.acquire(threadCount); //获取不到则等待,直到所有任务完成。 } private static class WorkerThread implements Runnable { private Semaphore semaphore; private String name; public WorkerThread(Semaphore semaphore, String name) { this.name = name; this.semaphore = semaphore; } public void run() { semaphore.release(); //增加记数 } } }
4. Phaser:JDK7中新加入的同步对象,比较强大。
可以实现CountdowLatch 和 CyclicBarrier的功能,但是count可以不是固定的。
还可以实现一批进程,按照一个阶段一个阶段的执行,每个阶段都等待其他进程结束后才继续进行。
详细参考这个帖子。
http://niklasschlimm.blogspot.com/2011/12/java-7-understanding-phaser.html