首页 > 编程语言 >Java中CountDownLatch和CyclicBarrier的区别与详解

Java中CountDownLatch和CyclicBarrier的区别与详解

时间:2024-09-25 18:50:17浏览次数:1  
标签:障碍 Java 选手 线程 CountDownLatch 翻过 CyclicBarrier

Java中CountDownLatch和CyclicBarrier的区别与详解

一.CountDownLatch 和 CyclicBarrier的区别

CountDownLatch 的计数器是大于或等于线程数的,而CyclicBarrier是一定等于线程数CountDownLatch 放行由其他线程控制而CyclicBarrier是由本身来控制的

二.详解

CountDownLatch

说明: 一个线程等待其他线程执行完之后再执行,相当于加强版的join,在初始化CountDownLatch是需要设定计数器的数值(计数器数据不一定跟线程数相同,但是一定计数器的值一定是要大于等于线程数,一个线程中可以进行多次扣减。当计数器扣减至0时才可继续向下执行

举例说明:
比如LOL在游戏开始时需要玩家全部准备完毕之后才开始,开始游戏可以理解为“主线程”,玩家准备理解为“其他线程”,在“其他线程”没有准备完毕之前,“主线程时等待状态”,当“其他线程”准备完毕之后“主线程”就会执行下一步开始游戏的动作

代码示例

?
1234567891011121314151617181920212223242526272829public class CountDownLatchTest {    private static CountDownLatch countDownLatsh = new CountDownLatch(5);     private static class Player implements Runnable{        private Integer index;        public Player(Integer index){            this.index = index;        }         @Override        public void run() {            System.out.println("玩家"+index+"准备完成");            countDownLatsh.countDown();        }    }        public static void main(String[] args) throws InterruptedException {             for(int i = 0; i < 5; i++){            Player player = new Player(i);            Thread thread = new Thread(player);            thread.start();        }        countDownLatsh.await();         System.out.println("玩家准备完毕,开始游戏");    }}
登录后复制讲解

运行结果

玩家0准备完成
玩家1准备完成
玩家2准备完成
玩家3准备完成
玩家4准备完成
玩家准备完毕,开始游戏

cyclicbarrier

说明: 让一组线程到达某个屏障,然后被阻塞,一直到最后一个线程到达屏障,然后屏障开放,所有被阻塞的线程继续执行,计数器与线程数相等。
CyclicBarrier(int parties, Runnable barrierAction) 当时使用这个构造函数时,barrierAction定义的任务会执行

举例说明: 假设有一家公司要全体员工进行团建活动,活动内容为翻越三个障碍物,每一个人翻越障碍物所用的时间是不一样的。但是公司要求所有人在翻越当前障碍物之后再开始翻越下一个障碍物,也就是所有人翻越第一个障碍物之后,才开始翻越第二个,以此类推比如跨栏比赛,我们修改一下规则,当所有选手都跨过第一个栏杆是,才去跨第二个,以此类推,每一个员工都是一个“其他线程”。当所有人都翻越的所有的障碍物之后,程序才结束。而主线程可能早就结束了,这里我们不用管主线程。

代码示例

?
123456789101112131415161718192021222324252627282930313233public class CyclicBarrierTest {     private static CyclicBarrier cyclicBarrier = new CyclicBarrier(5);         public static class Surmount implements Runnable{        @Override        public void run() {             try {                for(int i = 1; i < 4; i++){                    Random rand = new Random();                    int randomNum = rand.nextInt((3000 - 1000) + 1) + 1000;//产生1000到3000之间的随机整数                    Thread.sleep(randomNum);                    String name = Thread.currentThread().getName();                    System.out.println(name+"翻过了第" + i +"个障碍");                    cyclicBarrier.await();                }            } catch (InterruptedException e) {                e.printStackTrace();            } catch (BrokenBarrierException e) {                e.printStackTrace();            }        }    }         public static void main(String[] args){        for (int i = 1; i < 6; i++){            Thread thread = new Thread(new Surmount(),"选手"+ i );            thread.start();        }        System.out.println("main is end");    }}
登录后复制讲解

运行结果:

main is end
选手4翻过了第1个障碍
选手2翻过了第1个障碍
选手1翻过了第1个障碍
选手5翻过了第1个障碍
选手3翻过了第1个障碍
选手1翻过了第2个障碍
选手4翻过了第2个障碍
选手3翻过了第2个障碍
选手5翻过了第2个障碍
选手2翻过了第2个障碍
选手5翻过了第3个障碍
选手2翻过了第3个障碍
选手1翻过了第3个障碍
选手4翻过了第3个障碍
选手3翻过了第3个障碍

到此这篇关于Java中CountDownLatch和CyclicBarrier的区别与详解的文章就介绍到这了,更多相关Java CountDownLatch CyclicBarrier内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

原文链接:https://www.jb51.net/program/3045568lh.htm

标签:障碍,Java,选手,线程,CountDownLatch,翻过,CyclicBarrier
From: https://www.cnblogs.com/sunny3158/p/18431979

相关文章

  • javascript向数组添加元素
    javascript向数组添加元素,比较常用的是两种方法,一种是向数组后面添加元素,一种是在数组前面添加元素。向数组后面添加元素,一般用push语句,它返回的是添加新元素之后的数组长度。push语法格式是数组名.push('要添加的数组元素')比如有一个数组名字叫arr,要向数组后面添加一个'g......
  • unity调用java静态方法
    在Unity中调用Java静态方法通常需要通过Android插件实现。以下是基本步骤:创建Java类:在AndroidStudio中创建一个Java类,包含静态方法。packagecom.example.myplugin;publicclassMyJavaClass{publicstaticStringmyStaticMethod(){return"Hello......
  • JAVA Response 返回值再拿
    在Java中,处理HTTP响应的返回值通常涉及使用库如HttpURLConnection或更现代的库如HttpClient。以下是一个基本的示例,展示了如何发送请求并处理响应:使用 HttpURLConnectionimportjava.io.BufferedReader;importjava.io.InputStreamReader;importjava.net.HttpURLConnection;im......
  • java中abstract关键字的使用案例
    创建动物父类跟狗猫子类abstractclassAnimal1{//抽象类Stringname;intage;Stringvariety;publicAnimal1(){}publicAnimal1(Stringname,intage,Stringvariety){//有参构造this.age=age;this.name=name;......
  • Java day 05
    Javaday05面向对象1.面向对象与面向过程的区别面向过程的思想:代表语言c语言功能开发的每一步都是自己参与的面向对象的思想:代表语言Java语言指的是不断地创建对象,指挥对象事情过程举例现实生活的例子喝水:面向过程的思想:自己拿起水杯,自己走到饮水机前,自己接水面向......
  • Java的详细学习路线
    大家好!我是故里dd,今天给大家说说Java的学习路线!Java的详细学习路线可以分为多个阶段,每个阶段都涵盖了不同的核心知识点和技能。以下是一个较为全面的Java学习路线,供您参考:第一阶段:Java核心基础阶段1.Java基础语法:  -了解Java的基本语法,如数据类型、变量、运算符、控制......
  • java-重启异常断掉的线程和监控线程状态
    java-重启异常断掉的线程和监控线程状态背景主要代码打印结果总结背景有一个线程,可能会因为异常而终止掉。为了监控这个线程,我又启动一个线程去监控。主要代码代码主要是由两个线程和两个可以产生异常的方法,内容跟简单,如下importjava.time.LocalDateTime;impor......
  • Java面试-Redis篇(二)
    分布式锁抢劵场景分布式锁使用集群分布式锁使用代码展示setnx实现分布式锁Redis实现分布式锁主要利用Redis的setnx命令。setnx是SETifnotexists(如果不存在,则SET)的简写。redisson给锁续期代码实现publicvoidredisLock()throwsInterruptedException......
  • java+vue计算机毕设X钢材商贸公司网络购销管理系统【源码+程序+论文+开题】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展和互联网经济的蓬勃兴起,传统钢材商贸行业正面临前所未有的变革与挑战。X钢材商贸公司作为业内的佼佼者,长期以来依赖传统的购销......
  • java+vue计算机毕设爱心宠物中心管理系统【源码+程序+论文+开题】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着现代生活节奏的加快和城市化进程的推进,宠物已成为许多家庭不可或缺的重要成员,它们不仅为人们的生活带来了欢乐与陪伴,也促进了人与动物之间的情感......