java中 CountDownLatch 同步类的使用
一、什么是countDownlatch
CountDownLatch是一个同步工具类,它通过一个计数器来实现的,初始值为线程的数量。每当一个线程完成了自己的任务,计数器的值就相应得减1。当计数器到达0时,表示所有的线程都已执行完毕,然后在等待的线程就可以恢复执行任务。
二、方法详解
- CountDownLatch(int count):count为计数器的初始值(一般需要多少个线程执行,count就设为几)。
- countDown(): 每调用一次计数器值-1,直到count被减为0,代表所有线程全部执行完毕。
- getCount():获取当前计数器的值。
- await(): 等待计数器变为0,即等待所有异步线程执行完毕。
- boolean await(long timeout, TimeUnit unit): 此方法与await()区别:
①此方法至多会等待指定的时间,超时后会自动唤醒,若 timeout 小于等于零,则不会等待
②boolean 类型返回值:若计数器变为零了,则返回 true;若指定的等待时间过去了,则返回 false
三、CountDownLatch应用场景
- 某个线程需要在其他n个线程执行完毕后再向下执行
- 多个线程并行执行同一个任务,提高响应速度
四、代码实例
举例:学生考试,学生和监考老师都各自是一个线程,学生答完试卷交卷就可以离开,监考老师需要在所有的考生交完试卷才能离开。
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基础
3630
使用wait和notify的条件wait()与notify/notifyAll方法必须在同步代码块中使用,如果不是在同步方法或同步代码块中使用则会报异常Exceptioninthread"main
blog
Java中的四种引用
java基础
2121
Java中的四种引用强引用(StrongReference)软引用(SoftReference)弱引用(WeakReference)虚引用(PhantomReference)1.强引用
official
1391
之前的文章中提到了java中的nio是同步非阻塞的网络io模型,本文就主要说明一下同步、异步、阻塞、非阻塞的概念来帮助理解nio。io操作IO分两阶段(一旦拿到数据后就变成了数据操作,不再是IO
java基础
1257
核心类ZipInputStream的api文档请参考:https://nowjava.com/docs/java-api-11/java.base/java/util/zip
blog
java中有没有goto关键字
java基础
1499
答案:java中有goto关键字,但是goto是java语言中的保留字,目前还没有在java中使用。其实goto这个词是C语言中的,goto语句通常与条件语句配合使用,可用来实现条件转移,构成循环
ofc
进程同步、进程互斥
official
1011
,因此“写数据”和“读数据”两个操作执行的先后顺序是不确定的。而实际应用中,又必须按照“写数据→读数据”的顺序来执行的。如何解决这种异步问题,就是“进程同步”所讨论的内容。同步亦称直接制约关系,它是指为
算法基础
2279
什么是jxlsjxls是一个简单的、轻量级的excel导出库,使用特定的标记在excel模板文件中来定义输出格式和布局。其实java中成熟的excel导出工具有pol、jxl,但他们都是使用java
java基础
1256
核心类ZipOutputStream的api文档请参考:https://nowjava.com/docs/java-api-11/java.base/java/util/zip
最新发表
归档
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
2024-08
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
加密算法
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。