zoukankan      html  css  js  c++  java
  • 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();  
                    }  
                }  
            }  
        }  
    }  
  • 相关阅读:
    [python]python学习笔记(七)——加密
    Android 实现ListView的A-Z字母排序和过滤搜索功能,实现汉字转成拼音 .
    Android 关于汉字转拼音的工具类Pinyin4jUtil 的使用说明
    20条技巧,让Chrome超越Firefox
    Android 内存优化
    WebView详解
    Android 获取手机通讯录信息 — 姓名和号码
    Android 获取手机通讯录信息 — 头像、姓名和A-Z的快速查询
    Android 快速开发框架AFinal
    Android 滑动改变视频音量和视频缩略图
  • 原文地址:https://www.cnblogs.com/caobojia/p/6768112.html
Copyright © 2011-2022 走看看