• CountDownLatch的简单使用


    from https://www.jianshu.com/p/cef6243cdfd9

    1.CountDownLatch是什么?

    CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行。

    典型的用法是将一个程序分为n个互相独立的可解决任务,并创建值为n的CountDownLatch。当每一个任务完成时,都会在这个锁存器上调用countDown,等待问题被解决的任务调用这个锁存器的await,将他们自己拦住,直至锁存器计数结束。

    2.一个简单的例子

    在主线程中,开5个子线程来执行20个任务,只有等任务全部完成后,主线程才能再去做其它事。

    测试代码:

    public class CountDownLatchTest {
    
        private int threadNum = 5;//执行任务的子线程数量
        private int workNum = 20;//任务数量
        private ExecutorService service;
        private ArrayBlockingQueue<String> blockingQueue;
        private CountDownLatch latch;
    
        @Before
        public void setUp() {
            service = Executors.newFixedThreadPool(threadNum, new ThreadFactoryBuilder().setNameFormat("WorkThread-%d").build());
            blockingQueue = new ArrayBlockingQueue<>(workNum);
            for (int i = 0; i < workNum; i++) {
                blockingQueue.add("任务-" + i);
            }
            latch = new CountDownLatch(workNum);//计数器的值为任务的数量
        }
    
        @Test
        public void test() throws InterruptedException {
            SoutUtil.print("主线程开始运行");
            for (int i = 0; i < workNum; i++) {
                service.execute(new WorkRunnable());
            }
            latch.await();//等待子线程的所有任务完成
            SoutUtil.print("主线程去做其它事");
        }
    
        //用blockQueue中的元素模拟任务
        public String getWork() {
            return blockingQueue.poll();
        }
    
        class WorkRunnable implements Runnable {
    
            public void run() {
                String work = getWork();
                performWork(work);
                latch.countDown();//完成一个任务就调用一次
            }
        }
    
        private void performWork(String work) {
            SoutUtil.print("处理任务:" + work);
            try {
                //模拟耗时的任务
                Thread.currentThread().sleep(60);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
    }
    

    执行结果为:

    2016/12/09 22:23:02.860 main (CountDownLatchTest.java:36).test: 主线程开始运行
    2016/12/09 22:23:02.862 WorkThread-0 (CountDownLatchTest.java:59).performWork: 处理任务:任务-0
    2016/12/09 22:23:02.862 WorkThread-1 (CountDownLatchTest.java:59).performWork: 处理任务:任务-1
    2016/12/09 22:23:02.862 WorkThread-2 (CountDownLatchTest.java:59).performWork: 处理任务:任务-2
    2016/12/09 22:23:02.862 WorkThread-3 (CountDownLatchTest.java:59).performWork: 处理任务:任务-3
    2016/12/09 22:23:02.863 WorkThread-4 (CountDownLatchTest.java:59).performWork: 处理任务:任务-4
    2016/12/09 22:23:02.926 WorkThread-1 (CountDownLatchTest.java:59).performWork: 处理任务:任务-7
    2016/12/09 22:23:02.926 WorkThread-0 (CountDownLatchTest.java:59).performWork: 处理任务:任务-5
    2016/12/09 22:23:02.926 WorkThread-2 (CountDownLatchTest.java:59).performWork: 处理任务:任务-8
    2016/12/09 22:23:02.926 WorkThread-3 (CountDownLatchTest.java:59).performWork: 处理任务:任务-6
    2016/12/09 22:23:02.926 WorkThread-4 (CountDownLatchTest.java:59).performWork: 处理任务:任务-9
    2016/12/09 22:23:02.992 WorkThread-0 (CountDownLatchTest.java:59).performWork: 处理任务:任务-11
    2016/12/09 22:23:02.992 WorkThread-1 (CountDownLatchTest.java:59).performWork: 处理任务:任务-12
    2016/12/09 22:23:02.992 WorkThread-3 (CountDownLatchTest.java:59).performWork: 处理任务:任务-13
    2016/12/09 22:23:02.992 WorkThread-4 (CountDownLatchTest.java:59).performWork: 处理任务:任务-14
    2016/12/09 22:23:02.992 WorkThread-2 (CountDownLatchTest.java:59).performWork: 处理任务:任务-10
    2016/12/09 22:23:03.057 WorkThread-1 (CountDownLatchTest.java:59).performWork: 处理任务:任务-16
    2016/12/09 22:23:03.057 WorkThread-2 (CountDownLatchTest.java:59).performWork: 处理任务:任务-18
    2016/12/09 22:23:03.057 WorkThread-0 (CountDownLatchTest.java:59).performWork: 处理任务:任务-15
    2016/12/09 22:23:03.057 WorkThread-3 (CountDownLatchTest.java:59).performWork: 处理任务:任务-17
    2016/12/09 22:23:03.057 WorkThread-4 (CountDownLatchTest.java:59).performWork: 处理任务:任务-19
    2016/12/09 22:23:03.120 main (CountDownLatchTest.java:41).test: 主线程去做其它事
    

    参考目录:

    1. 什么时候使用CountDownLatch
    2. JDK1.8源码分析之CountDownLatch
    3. CountDownLatch源码的理解
    4. countdownlatch源码分析


    作者:天然鱼
    链接:https://www.jianshu.com/p/cef6243cdfd9
    來源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    jsp报源码
    c#简单写售票系统
    linux常用命令大全[转]
    【转载】大型网站渗透思之信息收集
    Ajax初窥
    屏蔽win10中文输入法
    win10禁止更新的方法
    win10进入到安全模式的三种方法
    7代CPU安装win7的方法
    python的输出问题
  • 原文地址:https://www.cnblogs.com/aoyihuashao/p/9004273.html
Copyright © 2020-2023  润新知