Pharser CyclicBarrier CountdownLatch Semaphore

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

猜你喜欢

转载自spark-li.iteye.com/blog/2215391