18 CyclicBarrier CountDownLacth

2024-04-29 13:08

本文主要是介绍18 CyclicBarrier CountDownLacth,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

CyclicBarrier使用

假设只有一个场景,每个线程代表一个跑步运动员,当运动员都准备好后,才一起出发,只要有一个人没有准备好,大家都等待。

 

代码示例:

 

import java.io.IOException;  

import java.util.Random;  

import java.util.concurrent.BrokenBarrierException;  

import java.util.concurrent.CyclicBarrier;  

import java.util.concurrent.ExecutorService;  

import java.util.concurrent.Executors;

public class UseCyclicBarrier {

 

static class Runner implements Runnable {  

    private CyclicBarrier barrier;  

    private String name;  

    

    public Runner(CyclicBarrier barrier, String name) {  

        this.barrier = barrier;  

        this.name = name;  

    }  

    @Override  

    public void run() {  

        try {  

            Thread.sleep(1000 * (new Random()).nextInt(5));  

            System.out.println(name + "OK.");  

            barrier.await();  

        } catch (InterruptedException e) {  

            e.printStackTrace();  

        } catch (BrokenBarrierException e) {  

            e.printStackTrace();  

        }  

        System.out.println(name + " Go!!");  

    }  

}

    public static void main(String[] args) throws IOException, InterruptedException {  

        /**

         * 当达到3个await后,一起执行等待后面的代码

         */

    CyclicBarrier barrier = new CyclicBarrier(3);  // 3

        

        ExecutorService executor = Executors.newFixedThreadPool(3);  

        

        executor.submit(new Thread(new Runner(barrier, "zhangsan")));  

        executor.submit(new Thread(new Runner(barrier, "lisi")));  

        executor.submit(new Thread(new Runner(barrier, "wangwu")));  

  

        executor.shutdown();  

    }  

  

}  

代码结果:

lisiOK.

wangwuOK.

zhangsanOK.

zhangsan Go!!

wangwu Go!!

lisi Go!!


 CountDownLacth使用

它经常用于监听某些初始化操作,等待初始化执行完毕后,通知主线程继续工作。

 

代码示例:

import java.util.concurrent.CountDownLatch;

 

/**

 * new CountDownLatch(2)中的参数是2,即当countDown.await()后

 * 需要2次countDown.countDown();后才会去执行countDown.await()后面的代码

 * @author Vision_TXG

 *

 */

public class UseCountDownLatch {

 

public static void main(String[] args) {

//注意参数

final CountDownLatch countDown = new CountDownLatch(2);

Thread t1 = new Thread(new Runnable() {

@Override

public void run() {

try {

System.out.println("进入线程t1" + "等待其他线程处理完成。。。");

countDown.await();//需要等待两个countDown.countDown()操作,由定义的参数决定

System.out.println("t1线程继续执行....");

} catch (InterruptedException e) {

e.printStackTrace();

}

}

},"t1");

Thread t2 = new Thread(new Runnable() {

@Override

public void run() {

try {

System.out.println("t2线程进行初始化操作...");

Thread.sleep(3000);

System.out.println("t2线程初始化完毕,通知t1线程继续...");

countDown.countDown();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

});

Thread t3 = new Thread(new Runnable() {

@Override

public void run() {

try {

System.out.println("t3线程进行初始化操作...");

Thread.sleep(4000);

System.out.println("t3线程初始化完毕,通知t1线程继续...");

countDown.countDown();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

});

t1.start();

t2.start();

t3.start();

}

}

 

代码执行结果:

进入线程t1等待其他线程处理完成。。。

t2线程进行初始化操作...

t3线程进行初始化操作...

t2线程初始化完毕,通知t1线程继续...

t3线程初始化完毕,通知t1线程继续...

t1线程继续执行....

注意:CyclicBarrierCountDownLacth的区别

 

CountDownLacth是一个线程等待,其他的n个线程发出通知。针对的是一个线程

CyclicBarrier的线程都是参与阻塞的。针对的是多个线程。


这篇关于18 CyclicBarrier CountDownLacth的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/946174

相关文章

source配置文件不生效 原创 2016年03月14日 18:43:55 3558 问题背景: 升级jdk 1.8之后,启动时报版本编译问题,查看$JAVA_HOME,$JRE_HOME

source配置文件不生效 原创  2016年03月14日 18:43:55 3558 问题背景:       升级jdk 1.8之后,启动时报版本编译问题,查看$JAVA_HOME,$JRE_HOME,没有问题。      初步推断是没有source,sourec .bashrc 之后查看$JAVA_HOME,$JRE_HOME变成1.8版本,但启动时还是报错,这就

Linux下Tomcat开机自动启动 原创 2014年07月18日 12:32:49 标签:Linux /tomcat /shell /启动 22095 Linux下tomcat开机自动启动有两种方法

Linux下Tomcat开机自动启动 原创  2014年07月18日 12:32:49 标签:Linux /tomcat /shell /启动 22095 Linux下tomcat开机自动启动有两种方法,一种是简单,一种是复杂而又专业的,使用shell脚本要实现,我们一般推荐shell脚本启动方式。下面我们分别介绍这两种方法。 1.shell脚本启动 众所周知,在L

软件需求开发的18般武艺

在《软件工程最佳实践》一书中,罗列了18种软件需求方法论,这里逐一介绍如下: 1、引入用户代表的敏捷开发需求 “用户代表”代表的是用户,决定的是需求。有了用户代表,需求的确认和变更,以及需求优先顺序的确定,都会便捷很多。这种方法完美契合敏捷的“交流胜于文档”的思想。唯一的问题是,这种方法论只能适用于小型软件的开发,对于大型软件来说,它就无能为力;甚至某些特定的嵌入式系统软件,如燃油喷射控制系统

【Rust日报】 2019-07-18:美国国会关于Libra的听证会

美国国会关于Libra的听证会 有议员提到,为什么为选择Rust来开发Libra,它够成熟吗?如何担负起其对安全的要求。内有彩蛋:D Read More 是否真的需要构造器 这篇文章 中,讨论了构造器是什么,Rust选择了没有构造器,这背后的权衡是什么?会有什么问题。并且对比了一下Swift的选择。等等,很细致。值得一看。 heim - 获取系统信息的工具项目 这个项目用于,跨平台,获取系统基本

【Rust 日报】2021-07-18 -- Quickwit 高性能对象存储搜索引擎

Quickwit:亚秒级延迟的对象存储搜索引擎 如果用过 ES,会感到非常熟悉,具体包括以下步骤: 第一步:编写索引配置文件 wiki_index_config.json(以 wiki 为例),保存到当前目录: {"default_search_fields": ["body", "title"], // If you do not specify fields in your query, t

【Rust日报】2022-2-18 PostgreSQL 与 Rust 聚合

PostgreSQL 与 Rust 聚合 在使用 PostgreSQL 时,使用类似 SUM(vals) 或者 AVG(vals) 是一个常见的习惯。这些聚合函数为用户提供了一种简单、有效的方法来计算一组输入的结果。那么它们是如何工作的?是什么让它们与普通函数不同?我们如何制作一个聚合函数?还有哪些其他用途?通过 pgx 我们使用 SQL 创建一些基本的聚合方法,然后使用 pgx 0.3.0 的

云计算【第一阶段(18)】磁盘管理与文件系统

一、磁盘基础 磁盘(disk)是指利用磁记录技术存储数据的存储器。 磁盘是计算机主要的存储介质,可以存储大量的二进制数据,并且断电后也能保持数据不丢失。 早期计算机使用的磁盘是软磁盘(Floppy Disk,简称软盘),如今常用的磁盘是硬磁盘(Hard disk,简称硬盘)。 也就是现在说的硬盘就相当于是说我们的磁盘。 二、磁盘结构 磁盘分为: 机械硬盘(HDD)和固态硬盘(SS

VBA学习(18):VBA制作任意工作表均可使用的聚光灯

在需要制作聚光的工作簿,按<ALT+F11>组合键,打开VBE编辑器。在右侧[工程资源管理器窗格]选中ThisWorkbook模块,将以下代码复制粘贴到该模块的代码窗口。 Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)Application.ScreenUpdating =

一步步学习SPD2010--第三章节--处理列表和库(18)----删除SP对象

你可以使用SPD删除许多SP对象。例如,可以删除列表、库、文件、网站列、内容类型和列表栏目。然而,不能删除列表项目。任何列表、库、页面、文件或列表项目,无论在浏览器中还是SPD中删除,都保存在回收站,你可以还原。当你删除SP对象,如列表栏目、自定义操作、网站列和内容类型时,他们不再保存在回收站,还原过程也更复杂,并涉及到IT部门。         本次练习中,你删除一个列表、

亚足联官方公布18强赛抽签时间及规则,国足确认位列第五档,你们觉得国足能进世界杯吗?

亚足联官方公布18强赛抽签时间及规则,国足确认位列第五档,你们觉得国足能进世界杯吗? 今天亚足联官方宣布了世预赛18强赛分组抽签仪式时间,本次抽签仪式将于6月27日15点在马来西亚吉隆坡举行。除了抽签时间之外,足联还官方确认了参加世预赛18强的这 18 支球队获得了 2027 年沙特亚洲杯的参赛资格。 按照规则:世预赛亚洲区18强赛将与2024年9月拉开战幕,2025年6月结束,18支球队