Java核心知识点学习----线程同步工具类,CyclicBarrier学习

时间:2022-09-10 07:47:14

线程同步工具类,CyclicBarrier日常开发较少涉及,这里只举一个例子,以做备注.N个人一块出去玩,相约去两个地方,CyclicBarrier的主要作用是等待所有人都汇合了,才往下一站出发.

1.效果如下:

Java核心知识点学习----线程同步工具类,CyclicBarrier学习

2.实现代码:

package com.amos.concurrent;

import java.util.Random;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; /**
* @ClassName: CyclicBarrierTest
* @Description: 线程同步工具类,CyclicBarrier的主要作用是等待所有人都汇合了,才往下一站出发,日常应用中较少涉及
* @author: amosli
* @email:hi_amos@outlook.com
* @date Apr 25, 2014 1:35:34 AM
*/
public class CyclicBarrierTest {
public static void main(String[] args) {
final CyclicBarrier cyclicBarrier = new CyclicBarrier(3);
ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
for(int i=0;i<3;i++){
Runnable runnable = new Runnable() {
public void run() {
try {
Thread.sleep(new Random().nextInt(1000));
} catch (Exception e1) {
e1.printStackTrace();
}
System.out.println("线程"+Thread.currentThread().getName()+"即将到达集合点1"+",当前已有"+(cyclicBarrier.getNumberWaiting()==2?(cyclicBarrier.getNumberWaiting()+1)+"人,人数已经集合完毕,即将向下一站进发":(cyclicBarrier.getNumberWaiting()+1)+"人"));
try {
cyclicBarrier.await();
} catch (Exception e1) {
e1.printStackTrace();
} try {
Thread.sleep(new Random().nextInt(1000));
} catch (Exception e1) {
e1.printStackTrace();
}
System.out.println("线程"+Thread.currentThread().getName()+"即将到达集合点2"+",当前已有"+(cyclicBarrier.getNumberWaiting()==2?(cyclicBarrier.getNumberWaiting()+1)+"人,人数已经集合完毕,即将向下一站进发":(cyclicBarrier.getNumberWaiting()+1)+"人"));
try {
cyclicBarrier.await();
} catch (Exception e1) {
e1.printStackTrace();
} }
};
newCachedThreadPool.execute(runnable);
}
newCachedThreadPool.shutdown();
}
}

3.用法:

1),如何创建?

CyclicBarrier cyclicBarrier = new CyclicBarrier((int parties);
CyclicBarrier cyclicBarrier =new CyclicBarrier(int parties, Runnable barrierAction)

2).如何控制线程到一个集结点?

cyclicBarrier.await();

调用await()方法即可.

同时可以设置最长待时间,只需要调用await(long timeout, TimeUnit unit)方法即可.

3)如何打破障碍?

breakBarrier(); 

调用breakBarrier() 方法将可以打破当前的障碍.

如果看其内部实现方法不难发现关于Lock锁的应用.

Java核心知识点学习----线程同步工具类,CyclicBarrier学习的更多相关文章

  1. java线程并发工具类CyclicBarrier、CountDownLatch及Semaphore

    一.CyclicBarrier   (原文链接:http://www.studyshare.cn/blog-front/blog/index ) 1.定义 CyclicBarrier是线程并发工具类之 ...

  2. Java八个并发学习——线程同步工具CyclicBarrier

    本文是一篇文章对网络的研究摘要,感谢您的无私分享. CyclicBarrier 类有一个整数初始值,此值表示将在同一点同步的线程数量.当当中一个线程到达确定点,它会调用await() 方法来等待其它线 ...

  3. java核心知识点----创建线程的第三种方式 Callable 和 Future CompletionService

    前面已经指出通过实现Runnable时,Thread类的作用就是将run()方法包装成线程执行体,那么是否可以直接把任意方法都包装成线程执行体呢?Java目前不行,但其模仿者C#中是可以的. Call ...

  4. JDK5新特性之线程同步工具类(三)

    一. Semaphore Semaphore能够控制同一时候訪问资源的线程个数, 比如: 实现一个文件同意的并发訪问数. Semaphore实现的功能就类似厕全部5个坑, 增加有十个人要上厕所, 那么 ...

  5. java多线程系列9 高级同步工具&lpar;3&rpar; CyclicBarrier

    CyclicBarrier 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)   然后一再执行 public class CyclicBar ...

  6. Java核心知识点学习----使用Condition控制线程通信

    一.需求 实现线程间的通信,主线程循环3次后,子线程2循环2次,子线程3循环3次,然后主线程接着循环3次,如此循环3次. 即:A->B->C---A->B->C---A-&gt ...

  7. Java核心知识点学习----线程中如何创建锁和使用锁 Lock&comma;设计一个缓存系统

    理论知识很枯燥,但这些都是基本功,学完可能会忘,但等用的时候,会发觉之前的学习是非常有意义的,学习线程就是这样子的. 1.如何创建锁? Lock lock = new ReentrantLock(); ...

  8. java 利用同步工具类控制线程

    前言 参考来源:<java并发编程实战> 同步工具类:根据工具类的自身状态来协调线程的控制流.通过同步工具类,来协调线程之间的行为. 可见性:在多线程环境下,当某个属性被其他线程修改后,其 ...

  9. Java核心知识点学习----多线程中的阻塞队列&comma;ArrayBlockingQueue介绍

    1.什么是阻塞队列? 所谓队列,遵循的是先进先出原则(FIFO),阻塞队列,即是数据共享时,A在写数据时,B想读同一数据,那么就将发生阻塞了. 看一下线程的四种状态,首先是新创建一个线程,然后,通过s ...

随机推荐

  1. 吴奇隆刘诗诗婚礼场地:巴厘岛Ayana酒店,美到窒息!

    导读:忍不住转载一下,原文地址:http://www.sjq315.com/news/270768.html 3月20日,吴奇隆和刘诗诗在巴厘岛五星级酒店Ayana Resort and Spa酒店举 ...

  2. Swift开发第九篇——Any和AnyObject&amp&semi;typealias和泛型接口

    本篇分为两部分: 一.Swift中的Any和AnyObject 二.Swift中的typealias和泛型接口 一.Swift中的Any和AnyObject 在 Swift 中,AnyObject 可 ...

  3. bash中变量&plus;&equals;,if大小判断,随机休眠

    #!/bin/bash index= while true;do echo "hello" (( index+=)) echo `date "+%H:%M:%S&quot ...

  4. Liferay 6&period;2 改造系列之十八:修改登录Portlet配置,去除无用链接

    在/portal-master/portal-impl/src/portal.properties文件中,有如下配置: # # Input a list of sections that will b ...

  5. JavaScript忍者秘籍——驯服线程和定时器

    1.定时器和线程 - 设置和清除定时器 JavaScript提供了两种方式,用于创建定时器以及两个相应的清除方法.这些方法都是window对象上的方法. 方法 格式 描述 setTimeout   i ...

  6. docker安装centos后没有ifconfig命令解决办法

    使用docker pull centos命令下载下来的centos镜像是centos7的最小安装包,里面并没有携带ifconfig命令,导致我想查看容器内的ip时不知道该怎么办 yum provide ...

  7. python——eval&lpar;&rpar;函数

    eval()函数用来执行一个字符串表达式,并返回表达式的值. 语法:eval(expression[, globals[, locals]]) x = 4 print(eval('3 * x'))12 ...

  8. windows下mongodb基础玩法系列二CURD附加一

    windows下mongodb基础玩法系列 windows下mongodb基础玩法系列一介绍与安装 windows下mongodb基础玩法系列二CURD操作(创建.更新.读取和删除) windows下 ...

  9. webuploader 百度上传,一个页面多个上传按钮

    需求:列表里每条数据需加文件上传 html: <div> <ul class="SR_wrap_pic"></ul> <button ty ...

  10. eventEmitter

    wade-mac:fin_server_invest mac$ node > var events =require('events') undefined > var eventEmit ...