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