CyclicBarrier与CountDownLatch的区别

Posted 起个po名真费劲

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CyclicBarrier与CountDownLatch的区别相关的知识,希望对你有一定的参考价值。

import java.util.concurrent.CountDownLatch;
/**
 * 作用于单个线程或几个线程,,在其他线程执行完之前,一直等待(await)知道countDown为零
 * @author Administrator
 *
 */
public class CountDownlatchTest {  
    public static void main(String[] args) throws InterruptedException {  
        CountDownLatch countDownLatch = new CountDownLatch(5);  
        for(int i=0;i<5;i++){  
            new Thread(new readNum(i,countDownLatch)).start();  
        }  
        countDownLatch.await();  
        System.out.println("线程执行结束。。。。");  
    }  
  
    static class readNum  implements Runnable{  
        private int id;  
        private CountDownLatch latch;  
        public readNum(int id,CountDownLatch latch){  
            this.id = id;  
            this.latch = latch;  
        }  
        @Override  
        public void run() {  
            synchronized (this){  
                System.out.println("id:"+id);
                latch.countDown();
                System.out.println("线程组任务"+id+"结束,其他任务继续");
            }  
        }  
    }  
}  
/**
 * 作用于多个线程
 * 可以通过CyclicBarrier实现没有先后顺序的同时执行任意的线程(假设cpu也是任意个)
 * 多个线程一直阻塞,直到await数量达到CyclicBarrier的参数时,唤醒阻塞的线程
 * 可重用
 * @author Administrator
 *
 */
public class CyclicBarrierTest {  
    public static void main(String[] args) throws InterruptedException {  
        CyclicBarrier cyclicBarrier = new CyclicBarrier(5, new Runnable() {  
            @Override  
            public void run() {  
                System.out.println("线程组执行结束");  
            }  
        });  
        for (int i = 0; i < 5; i++) {  
            new Thread(new readNum(i,cyclicBarrier)).start();  
        }  
        //CyclicBarrier 可以重复利用,  
        // 这个是CountDownLatch做不到的  
//        for (int i = 11; i < 16; i++) {  
//            new Thread(new readNum(i,cyclicBarrier)).start();  
//        }  
    }  
    static class readNum  implements Runnable{  
        private int id;  
        private CyclicBarrier cyc;  
        public readNum(int id,CyclicBarrier cyc){  
            this.id = id;  
            this.cyc = cyc;  
        }  
        @Override  
        public void run() {  
            synchronized (this){  
                System.out.println("id:"+id);  
                try {  
                    cyc.await();  
                    System.out.println("线程组任务" + id + "结束,其他任务继续");  
                } catch (Exception e) {  
                    e.printStackTrace();  
                }  
            }  
        }  
    }  
}  

 

以上是关于CyclicBarrier与CountDownLatch的区别的主要内容,如果未能解决你的问题,请参考以下文章

CountDownLatch与CyclicBarrier区别,举例

JAVA多线程提高十:同步工具CyclicBarrier与CountDownLatch

CyclicBarrier与CountDownLatch的区别

CountDownLatch与CyclicBarrier

CyclicBarrier和CountDownLatch的用法与区别

JUC并发编程 共享模式之工具 JUC CyclicBarrier(循环栅栏 与CountdownLatch最大的不同是可以重值倒计时) -- CyclicBarrier介绍使用注意事项