zoukankan      html  css  js  c++  java
  • CountDownLatch在多线程中的使用

    两种常用的使用方式

    1、主线程中开启多个子线程,所有子线程执行完后再执行主线程,多个线程同时运算,某些情况下可以提高效率

    CountDownLatch countDownLatch = new CountDownLatch(5);
            for (int i = 0; i < 5; i++) {
                final int index = i;
                new Thread(() -> {
                    try {
                        Thread.sleep(30000 + ThreadLocalRandom.current().nextInt(1000));
                        System.out.println("finish" + index + Thread.currentThread().getName());
                        countDownLatch.countDown();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }).start();
            }
            System.out.println("主线程开始等待30秒");
            countDownLatch.await(10, TimeUnit.SECONDS);// 主线程在阻塞,当计数器==0或者等待超时,就唤醒主线程往下执行。
            System.out.println("主线程:在所有任务运行完成后,进行结果汇总");

    结果如下

    如果 countDownLatch.await();不传参数则先执行所有子线程,子线程都完成才完成主线程

    2、子线程进行等待,等主线程发信号所有子线程开始执行

    CountDownLatch countDownLatch = new CountDownLatch(1);
            for (int i = 0; i < 5; i++) {
                new Thread(() -> {
                    try {
                        //准备完毕……运动员都阻塞在这,等待号令
                        countDownLatch.await();
                        String parter = "【" + Thread.currentThread().getName() + "】";
                        System.out.println(parter + "开始执行……");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }).start();
            }
    
            Thread.sleep(2000);// 裁判准备发令
            System.out.println("准备执行");
            countDownLatch.countDown();// 发令枪:执行发令

    打印结果如下

  • 相关阅读:
    模块的初始
    requests模块的高级用法
    爬虫数据解析方式
    2th
    0
    ..
    .

    1th-绪论
    Py2x & Py3x版本的区别
  • 原文地址:https://www.cnblogs.com/wscw/p/15252698.html
Copyright © 2011-2022 走看看