博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java5 CyclicBarrier同步工具
阅读量:6536 次
发布时间:2019-06-24

本文共 2091 字,大约阅读时间需要 6 分钟。

CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点(common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时CyclicBarrier很有用。因为该barrier 在释放等待线程后可以重用,所以称它为循环的barrier。

CyclicBarrier支持一个可选的Runnable命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作很有用。

例如:组织人员(线程)郊游,约定一个时间地点(路障),人员陆续到达地点,等所有人员全部到达,开始到公园各玩各的,再到约定时间去食堂吃饭,等所有人到齐开饭……

package com.ljq.test.thread;import java.util.concurrent.CyclicBarrier;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class CyclicBarrierTest {	public static void main(String[] args) {		ExecutorService service = Executors.newCachedThreadPool();		final  CyclicBarrier cb = new CyclicBarrier(3); //约定3个人		for(int i=0;i<3;i++){ //产生3个人			Runnable runnable = new Runnable(){					public void run(){					try {						Thread.sleep((long)(Math.random()*10000));							System.out.println("线程" + Thread.currentThread().getName() + 								"即将到达集合地点1,当前已有" + (cb.getNumberWaiting()+1) + "个已经到达," + (cb.getNumberWaiting()==2?"都到齐了,继续走啊":"正在等候"));												cb.await();												Thread.sleep((long)(Math.random()*10000));							System.out.println("线程" + Thread.currentThread().getName() + 								"即将到达集合地点2,当前已有" + (cb.getNumberWaiting()+1) + "个已经到达," + (cb.getNumberWaiting()==2?"都到齐了,继续走啊":"正在等候"));						cb.await();													Thread.sleep((long)(Math.random()*10000));							System.out.println("线程" + Thread.currentThread().getName() + 								"即将到达集合地点3,当前已有" + (cb.getNumberWaiting() + 1) + "个已经到达," + (cb.getNumberWaiting()==2?"都到齐了,继续走啊":"正在等候"));												cb.await();											} catch (Exception e) {						e.printStackTrace();					}								}			};			service.execute(runnable);		}		service.shutdown();	}}

打印结果:

线程pool-1-thread-1即将到达集合地点1,当前已有1个已经到达,正在等候线程pool-1-thread-3即将到达集合地点1,当前已有2个已经到达,正在等候线程pool-1-thread-2即将到达集合地点1,当前已有3个已经到达,都到齐了,继续走啊线程pool-1-thread-2即将到达集合地点2,当前已有1个已经到达,正在等候线程pool-1-thread-3即将到达集合地点2,当前已有2个已经到达,正在等候线程pool-1-thread-1即将到达集合地点2,当前已有3个已经到达,都到齐了,继续走啊线程pool-1-thread-2即将到达集合地点3,当前已有1个已经到达,正在等候线程pool-1-thread-1即将到达集合地点3,当前已有2个已经到达,正在等候线程pool-1-thread-3即将到达集合地点3,当前已有3个已经到达,都到齐了,继续走啊

  

转载地址:http://qnbdo.baihongyu.com/

你可能感兴趣的文章
ofstream 的中文目录问题
查看>>
Android存储方式之SQLite的使用
查看>>
springcloud ribbon 客户端负载均衡用法
查看>>
洛谷P1287 盒子与球 数学
查看>>
自定义starter
查看>>
Bootstrap vs Foundation如何选择靠谱前端框架
查看>>
手机WAP前端开发标准
查看>>
vue-cli脚手架一些插件安装elementui和axios
查看>>
[Gradle] 在 Eclipse 下利用 gradle 构建系统
查看>>
JAVAWEB 一一 Hibernate(框架)
查看>>
与、或、异或、取反、左移和右移
查看>>
jQuery根据元素值删除数组元素的方法
查看>>
Linux基础学习(14)--日志管理
查看>>
vue常用的指令
查看>>
matlab练习程序(随机游走图像)
查看>>
Linux命令行下运行java.class文件
查看>>
input文本框实现宽度自适应代码实例
查看>>
C#基本数据类型 <思维导图>
查看>>
POJ3321 Apple Tree (树状数组)
查看>>
一个程序员的自白(延迟满足)
查看>>