java中 CountDownLatch 同步类的使用

硅谷探秘者 Md java基础 1499 0 0

一、什么是countDownlatch

CountDownLatch是一个同步工具类,它通过一个计数器来实现的,初始值为线程的数量。每当一个线程完成了自己的任务,计数器的值就相应得减1。当计数器到达0时,表示所有的线程都已执行完毕,然后在等待的线程就可以恢复执行任务。

二、方法详解

  1. CountDownLatch(int count):count为计数器的初始值(一般需要多少个线程执行,count就设为几)。
  2. countDown(): 每调用一次计数器值-1,直到count被减为0,代表所有线程全部执行完毕。
  3. getCount():获取当前计数器的值。
  4. await(): 等待计数器变为0,即等待所有异步线程执行完毕。
  5. boolean await(long timeout, TimeUnit unit): 此方法与await()区别:
    ①此方法至多会等待指定的时间,超时后会自动唤醒,若 timeout 小于等于零,则不会等待
    ②boolean 类型返回值:若计数器变为零了,则返回 true;若指定的等待时间过去了,则返回 false

三、CountDownLatch应用场景

  1. 某个线程需要在其他n个线程执行完毕后再向下执行
  2. 多个线程并行执行同一个任务,提高响应速度

四、代码实例

举例:学生考试,学生和监考老师都各自是一个线程,学生答完试卷交卷就可以离开,监考老师需要在所有的考生交完试卷才能离开。

package spring.test2.service;

import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;

@Service
public class TestService {
    public static void main(String[] args) {
        CountDownLatch countDown = new CountDownLatch(2);
        List<String> result = Collections.synchronizedList(new ArrayList<>());
        new Thread(()->{
            try {
                Thread.sleep(2000); // 考十花费1秒
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            countDown.countDown();
            result.add("试卷1");
            System.out.println("学生1交卷 离开");
        }).start();

        new Thread(()->{
            try {
                Thread.sleep(1000);// 考试花费2秒
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            countDown.countDown();
            result.add("试卷2");
            System.out.println("学生2交卷 离开");
        }).start();

        try {
            if(countDown.await(2, TimeUnit.HOURS)){ // 考试时间最长2小时
                // 考试结束,老师离开
                System.out.println(result);
                System.out.println("老师离开");
            }else{
                System.out.println("超时");
            }
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}

评论区
请写下您的评论...
暂无评论...
猜你喜欢
java基础 3421 使wait和notify条件wait()与notify/notifyAll方法必须在代码块使,如果不是在方法或代码块使则会报异常Exceptioninthread"main
java基础 1919 Java四种引强引(StrongReference)软引(SoftReference)弱引(WeakReference)虚引(PhantomReference)1.强引
official 1065 之前文章提到了javanio是非阻塞网络io模型,本文就主要说明一下、异、阻塞、非阻塞概念来帮助理解nio。io操作IO分两阶段(一旦拿到数据后就变成了数据操作,不再是IO
java基础 1040 核心ZipInputStreamapi文档请参考:https://nowjava.com/docs/java-api-11/java.base/java/util/zip
java基础 1293 答案:java有goto关键字,但是goto是java语言保留字,目前还没有在java使。其实goto这个词是C语言,goto语句通常与条件语句配合使,可来实现条件转移,构成循环
算法基础 2002 什么是jxlsjxls是一个简单、轻量级excel导出库,使特定标记在excel模板文件来定义输出格式和布局。其实java成熟excel导出工具有pol、jxl,但他们都是使java
java基础 1037 核心ZipOutputStreamapi文档请参考:https://nowjava.com/docs/java-api-11/java.base/java/util/zip
official 821 ,因此“写数据”和“读数据”两个操作执行先后顺序是不确定。而实际应,又必须按照“写数据→读数据”顺序来执行。如何解决这种异问题,就是“进程”所讨论内容。亦称直接制约关系,它是指为
归档
2018-11  12 2018-12  33 2019-01  28 2019-02  28 2019-03  32 2019-04  27 2019-05  33 2019-06  6 2019-07  12 2019-08  12 2019-09  21 2019-10  8 2019-11  15 2019-12  25 2020-01  9 2020-02  5 2020-03  16 2020-04  4 2020-06  1 2020-07  7 2020-08  13 2020-09  9 2020-10  5 2020-12  3 2021-01  1 2021-02  5 2021-03  7 2021-04  4 2021-05  4 2021-06  1 2021-07  7 2021-08  2 2021-09  8 2021-10  9 2021-11  16 2021-12  14 2022-01  7 2022-05  1 2022-08  3 2022-09  2 2022-10  2 2022-12  5 2023-01  3 2023-02  1 2023-03  4 2023-04  2 2023-06  3 2023-07  4 2023-08  1 2023-10  1 2024-02  1 2024-03  1 2024-04  1
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo vue 导入导出 软件使用 idea插件 协议 无聊的知识 jenkins springboot mqtt协议 keepalived minio mysql ensp 网络基础 xxl-job rabbitmq haproxy srs 音视频 webrtc javascript
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。