2022
05-17
05-17
Java中CyclicBarrier和CountDownLatch的用法与区别
目录前言CountDownLatch例子CyclicBarrier构造函数例子两者区别前言CyclicBarrier和CountDownLatch这两个工具都是在java.util.concurrent包下,并且平时很多场景都会使用到。本文将会对两者进行分析,记录他们的用法和区别。CountDownLatchCountDownLatch是一个非常实用的多线程控制工具类,称之为“倒计时器”,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行。CountDownLatch是通过一个计数器来实现的,计数器...
继续阅读 >
使用场景由于公司业务需求,需要对接socket、MQTT等消息队列。众所周知socket是双向通信,socket的回复是人为定义的,客户端推送消息给服务端,服务端的回复是两条线。无法像http请求有回复。下发指令给硬件时,需要校验此次数据下发是否成功。用户体验而言,点击按钮就要知道此次的下发成功或失败。如上图模型,第一种方案使用Tread.sleep优点:占用资源小,放弃当前cpu资源缺点:回复速度快,休眠时间过长,仍然需要等待休眠结...
简述用来干嘛的?当你在方法中调用了多个线程,对数据库进行了一些不为人知的操作后,还有一个操作需要留到前者都执行完的重头戏,就需要用到CountDownLatch了实践代码packagecom.github.gleans;importjava.util.concurrent.CountDownLatch;publicclassTestCountDownLatch{publicstaticvoidmain(String[]args)throwsInterruptedException{CountDownLatchlatch=newCountDownLatch(3);newKeyPass(1000L...
1、CountDownLatch:一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行。2、ThreadPoolExecutor/ExecutorService:线程池,使用线程池可以复用线程,降低频繁创建线程造成的性能消耗,同时对线程的创建、启动、停止、销毁等操作更简便。3、使用场景举例:年末公司组织团建,要求每一位员工周六上午8点到公司门口集合,统一乘坐公司所租大巴前往目的地。在这个案例中,公司作为主线程,员工作为子线...
CountDownLatch在多线程并发编程中充当一个计时器的功能,并且维护一个count的变量,并且其操作都是原子操作。如下图,内部有下staticfinal的Sync类继承自AQS.该类主要通过countDown()和await()两个方法实现功能的,首先通过建立CountDownLatch对象,并且传入参数即为count初始值。如果一个线程调用了await()方法,那么这个线程便进入阻塞状态,并进入阻塞队列。如果一个线程调用了countDown()方法,则会使count-1;当count的值为...
2018.12.12更新在学习了CyclicBarrier之后发现,CyclicBarrier也可以实现跟CountDownLatch类似的功能,只需要在它的parties中多设置一个数,将主线程加入等待队列就可以了:publicstaticvoidmain(String[]args){ExecutorServicepool=Executors.newCachedThreadPool();intsize=3;//设置参数时,线程实际执行数size+1,将main线程也加到等待队列中CyclicBarriercyclicBarrier=newCyclicBarrier(size+1);...