线程:CyclicBarrier同步工具类
一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点。比如公司组织活动出去玩,需要在公司门口一起搭车去。每个人从家里出发去公司门口,到达的时间肯定先后不一样,所以公司的车要一直等待,等所有人到齐后,才开车出发。CyclicBarrier就类似这样的功能,当所有线程到达"屏蔽点"的时候,才往下走。
具体等待多少根线程到达,可以在构造方法里指定CyclicBarrier(int parties)。
当你的parties设为3的时候,假设只有2根线程到达此处,那程序会一直在此等待。可以设置timeout,当到达时间时,会抛出TimeoutException异常;当有4根线程的时候,只要任意3根到达屏蔽点,就会继续往下执行。
示例代码:
package ch03; import java.util.Random;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit; public class CyclicBarrierTest { public static void main(String[] args) {
final int count = 3;
//线程池
ExecutorService threadPool = Executors.newFixedThreadPool(count);
//实例化CyclicBarrier对象,并指定当到达屏蔽点的时候,
//需要执行的 操作,该操作由最后一个到达的线程执行。
final CyclicBarrier barrier = new CyclicBarrier(count, new Runnable() { @Override
public void run() {
System.out.println("前往下一个地点...");
}
});
System.out.println("参与个数:"+barrier.getParties());
for(int i=0; i<count; i++){
Runnable runnable = new Runnable() { @Override
public void run() {
try{
Thread.sleep(new Random().nextInt(5000));
System.out.println(Thread.currentThread().getName()+
"到达指定地点A,当前已有"+
(barrier.getNumberWaiting()+1)+"人到达,"+
(barrier.getNumberWaiting() == (count -1) ? "继续前进...":"等待其他人到来"));
//等待3个线程全部到达,当等待时间超过15s时,将报错
barrier.await(10, TimeUnit.SECONDS); Thread.sleep(new Random().nextInt(5000));
System.out.println(Thread.currentThread().getName()+"到达指定地点B,当前已有"+
(barrier.getNumberWaiting()+1)+"人到达,"+
(barrier.getNumberWaiting() == (count -1) ? "继续前进...":"等待其他人到来"));
barrier.await();
}catch(Exception e){
e.printStackTrace();
}
}
};
threadPool.execute(runnable);
}
threadPool.shutdown();
} }
输出结果:
线程:CyclicBarrier同步工具类的更多相关文章
- Java核心知识点学习----线程同步工具类,CyclicBarrier学习
线程同步工具类,CyclicBarrier日常开发较少涉及,这里只举一个例子,以做备注.N个人一块出去玩,相约去两个地方,CyclicBarrier的主要作用是等待所有人都汇合了,才往下一站出发. 1 ...
- java 利用同步工具类控制线程
前言 参考来源:<java并发编程实战> 同步工具类:根据工具类的自身状态来协调线程的控制流.通过同步工具类,来协调线程之间的行为. 可见性:在多线程环境下,当某个属性被其他线程修改后,其 ...
- 同步工具类 CountDownLatch 和 CyclicBarrier
在开发中,一些异步操作会明显加快执行速度带来更好的体验,但同时也增加了开发的复杂度,想了用好多线程,就必须从这些方面去了解 线程的 wait() notify() notifyall() 方法 线程异 ...
- JUC常用同步工具类——CountDownLatch,CyclicBarrier,Semaphore
在 JUC 下包含了一些常用的同步工具类,今天就来详细介绍一下,CountDownLatch,CyclicBarrier,Semaphore 的使用方法以及它们之间的区别. 一.CountDownLa ...
- Java并发之CyclicBarrier 可重用同步工具类
package com.thread.test.thread; import java.util.Random; import java.util.concurrent.*; /** * Cyclic ...
- 《java并发编程实战》读书笔记4--基础构建模块,java中的同步容器类&并发容器类&同步工具类,消费者模式
上一章说道委托是创建线程安全类的一个最有效策略,只需让现有的线程安全的类管理所有的状态即可.那么这章便说的是怎么利用java平台类库的并发基础构建模块呢? 5.1 同步容器类 包括Vector和Has ...
- Java并发编程系列-(2) 线程的并发工具类
2.线程的并发工具类 2.1 Fork-Join JDK 7中引入了fork-join框架,专门来解决计算密集型的任务.可以将一个大任务,拆分成若干个小任务,如下图所示: Fork-Join框架利用了 ...
- Java并发之同步工具类
1. CountDownlatch(计数器) 描述: 一个同步工具类,允许一个或多个线程等待其它线程完成操作 类图 通过指定的count值进行初始化,调用await方法的线程将被阻塞,直到count值 ...
- Java并发(基础知识)——显示锁和同步工具类
显示锁 Lock接口是Java ...
随机推荐
- jquery选择指定元素之外的所有元素
最近的项目中有这么一个需求,点击一排图片中的任意一张后底部弹出一个对话框,要求点击任意地方隐藏对话框 这个时候用not()显然是不现实的,用closest()可以实现差不多的功能 <!DOCTY ...
- xhtml规范
在使用XHTML语言进行网页制作时,必须要遵循一定的语法规范.下面进行详细讲解,其中具体内容可以分为以下几点. 文档方面: 必须定义文档类型(DTD)和你的名字空间 标签方面: 所有标签均要小写,合理 ...
- WebApi2官网学习记录---Content Negotiation
Content Negotiation的意思是:当有多种Content-Type可供选择时,选择最合适的一种进行序列化并返回给client. 主要依据请求中的Accept.Accept-Charset ...
- Tomcat6+nginx集群,达到负载均衡和session复制
nginx+tomcat做web项目集群,达到负载均衡.故障转移.session复制功能. 1.nginx配置文件见上一篇“nginx配置文件(反向代理+集群+动静分离)” 2.tomcat集群,修改 ...
- oracle 数据库 分割字符串返回结果集函数
CREATE OR REPLACE FUNCTION "UFN_SPLIT" ( p_list varchar2, p_sep varchar2 := ',' ...
- iOS在MRC工程环境下下使用ARC的方法
- SQL中将某个表中的多行数据在一个字段显示
项目需求:将某个表中的多行数据在一个字段显示,如下: 比如表A中有字段 ID,NAME, 表B中有字段ID,PID,DES, 表A,表B中的数据分别如下: ID NAME1 张三2 李四 ID PID ...
- hdu Repositoryti
算法:字典树 题意:给你一些字符串,然后会有一些询问,输出询问在给定的字符串中出现了多少次(字串也是): 例如 add,子串有:a ,d,d,ad ,dd,add:你会发现子串d出现了两次,那么怎么办 ...
- VC++函数(win32_exe)
1.windows输出,以对话框的方式. int MessageBox( HWND hWnd, // handle to owner window LPCTSTR lpText, // text in ...
- c# 中的线程和同步
一.新建线程的3种方法 a)异步委托:b)Thread类:c)线程池: 二.异步委托 1.简单使用,检查委托是否完成其任务 a) 通过 BeginInvoke() 的返回值IAsyncResult ...