如何进行并发工具类CountDownLatch与CyclicBarrier分析

如何进行并发工具类CountDownLatch与CyclicBarrier分析

如何进行并发工具类CountDownLatch与CyclicBarrier分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

CountDownLatch

如何进行并发工具类CountDownLatch与CyclicBarrier分析

基本的流程是一个线程等待其他的线程完成工作以后再执行,加强版join

类的主要方法,await用来等待,countDown(在线程里面)用来减一。

由初始化线程决定是否放行。

我们来用代码演示下CountDownLatch的基本使用:

public class UserCountDownLatch { static CountDownLatch latch = new CountDownLatch(6); //初始化线程 private static class InitThread implements Runnable{ @Override public void run() { System.out.println("Thread_"+Thread.currentThread().getId()+" ready init work ..."); latch.countDown();//初始化线程完成工作了。扣一次 } } public static void main(String[] args) throws InterruptedException { //单独的初始化线程,初始化分为2步,需扣减两次 new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(1000); System.out.println("Thread_"+Thread.currentThread().getId() +" ready init work step lst....."); latch.countDown();//每完成一步工作,就扣减一次 System.out.println("begin step 2nd......"); Thread.sleep(1000); System.out.println("Thread_"+Thread.currentThread().getId() +" ready init work step 2nd....."); latch.countDown();//每完成一步工作,就扣减一次 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); }
} }).start(); for(int i=0;i<=3;i++){ Thread thread = new Thread(new InitThread()); thread.start(); } latch.await(); System.out.println("Main do ites work ...."); }}

结果:

Thread_14readyinitwork...Thread_12readyinitwork...Thread_11readyinitwork...Thread_13readyinitwork...Thread_10readyinitworksteplst.....beginstep2nd......Thread_10readyinitworkstep2nd.....Maindoiteswork....

小结:就必须等到countDown减完才开始执行main方法后面的程序。

CyclicBarrier

让一组线程达到某个屏障,被阻塞,一直到组内最后一个线程达到屏障时,屏障开放,所有被阻塞的线程会继续运行。

由工作线程决定是否运行。

我们来用代码演示下CyclicBarrier的基本使用:

publicclassUseCyclicBarrier{privatestaticCyclicBarrierbarrier=newCyclicBarrier(5,newCollectThread());//屏障开放后,CollectThread()就会执行.privatestaticConcurrentHashMap<String,Long>resultMap=newConcurrentHashMap<String,Long>();//存放子线程工作结果的容器publicstaticvoidmain(String[]args){for(inti=0;i<=4;i++){Threadthread=newThread(newSubThread());thread.start();}}//负责屏障开放以后的工作privatestaticclassCollectThreadimplementsRunnable{@Overridepublicvoidrun(){StringBuilderresult=newStringBuilder();for(Map.Entry<String,Long>workResult:resultMap.entrySet()){result.append("["+workResult.getValue()+"]");}System.out.println("theresult="+result);System.out.println("dootherbusiness......");}}//工作线程privatestaticclassSubThreadimplementsRunnable{@Overridepublicvoidrun(){longid=Thread.currentThread().getId();resultMap.put(Thread.currentThread().getId()+"",id);Randomr=newRandom();//随机决定工作线程的是否睡眠try{if(r.nextBoolean()){Thread.sleep(2000+id);System.out.println("Thread_"+id+".....doitsbusiness");}System.out.println(id+".....isawait");barrier.await();//Thread.sleep(1000+id);System.out.println("Thread_"+id+".....doitsbusiness");}catch(Exceptione){e.printStackTrace();}}}}

小结:在初始化的时候,开放屏障后,可以使用指定执行的线程。

CyclicBarrier(int parties,RunnablebarrierAction)

不同在于动作的实施者是不同的,CountDownLatch 的下一步动作实施者是main函数,而CyclicBarrier下一步的动作实施者可以为其他线程。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注恰卡编程网行业资讯频道,感谢您对恰卡编程网的支持。

发布于 2021-12-29 23:18:53
收藏
分享
海报
0 条评论
35
上一篇:Win系统工具Everything以及UTools怎么用 下一篇:web中实现负载均衡技术的方式有哪些
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码