package com.thread.test.thread;

 import java.util.Random;
import java.util.concurrent.*; /**
* CyclicBarrier
* 同步工具:允许一组线程共同等待一个壁垒点
* 适用于固定数量线程的同步
* 等待线程释放后可以重复使用
*
* Created by windwant on 2016/5/27.
*/
public class MyCyclicBarrier {
public static void main(String[] args) {
ExecutorService es = Executors.newCachedThreadPool();
CyclicBarrier cb = new CyclicBarrier(5, new MainTask());//MainTask可选
Random r = new Random();
es.execute(new SubTask(cb, r.nextInt(10), "task1"));
es.execute(new SubTask(cb, r.nextInt(10), "task2"));
es.execute(new SubTask(cb, r.nextInt(10), "task3"));
es.execute(new SubTask(cb, r.nextInt(10), "task4"));
es.execute(new SubTask(cb, r.nextInt(10), "task5"));
es.shutdown();
}
} class MainTask implements Runnable { public void run() {
try {
System.out.println("mian task begin");
for (int i = 0; i < 5; i++) {
Thread.sleep(1000);
System.out.println("============" + i + "============");
}
System.out.println("mian task implemented");
} catch (Exception e) {
e.printStackTrace();
} }
} class SubTask implements Runnable{ private CyclicBarrier cb; private int seconds; private String taskName; SubTask(CyclicBarrier cb, int seconds, String taskName){
this.cb = cb;
this.seconds = seconds;
this.taskName = taskName;
} public void run() {
try{
System.out.println("subtask " + taskName + " begin, need time: " + seconds + "s");
long b = System.currentTimeMillis();
for (int i = 0; i < seconds; i++) {
Thread.sleep(1000);
System.out.println("subtask: " + taskName + "============" + i + "============");
}
long d = System.currentTimeMillis() - b;
System.out.println("subtask " + taskName + " over, executing time: " + TimeUnit.SECONDS.convert(d, TimeUnit.MILLISECONDS));
cb.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}

项目地址:https://github.com/windwant/windwant-demo/tree/master/thread-demo

Java并发之CyclicBarrier 可重用同步工具类的更多相关文章

  1. Java并发之CountDownLatch 多功能同步工具类

    package com.thread.test.thread; import java.util.Random; import java.util.concurrent.*; /** * CountD ...

  2. Java多线程同步工具类之CountDownLatch

    在过去我们实现多线程同步的代码中,往往使用join().wait().notiyAll()等线程间通信的方式,随着JUC包的不断的完善,java为我们提供了丰富同步工具类,官方也鼓励我们使用工具类来实 ...

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

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

  4. Java并发之同步工具类

    1. CountDownlatch(计数器) 描述: 一个同步工具类,允许一个或多个线程等待其它线程完成操作 类图 通过指定的count值进行初始化,调用await方法的线程将被阻塞,直到count值 ...

  5. 同步工具类 CountDownLatch 和 CyclicBarrier

    在开发中,一些异步操作会明显加快执行速度带来更好的体验,但同时也增加了开发的复杂度,想了用好多线程,就必须从这些方面去了解 线程的 wait() notify() notifyall() 方法 线程异 ...

  6. Java并发(基础知识)——显示锁和同步工具类

    显示锁                                                                                     Lock接口是Java ...

  7. Java 并发包中的高级同步工具

    Java 并发包中的高级同步工具 Java 中的并发包指的是 java.util.concurrent(简称 JUC)包和其子包下的类和接口,它为 Java 的并发提供了各种功能支持,比如: 提供了线 ...

  8. 《java并发编程实战》读书笔记4--基础构建模块,java中的同步容器类&并发容器类&同步工具类,消费者模式

    上一章说道委托是创建线程安全类的一个最有效策略,只需让现有的线程安全的类管理所有的状态即可.那么这章便说的是怎么利用java平台类库的并发基础构建模块呢? 5.1 同步容器类 包括Vector和Has ...

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

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

随机推荐

  1. MySQL带参数的存储过程小例子

    http://wwty.iteye.com/blog/698239 mysql存储过程也提供了对异常处理的功能:通过定义HANDLER来完成异常声明的实现 语法如下: DECLARE handler_ ...

  2. luogg_java学习_02_基本语法

    本文为博主辛苦总结,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 谢谢配合! 关键字 定义:被java语言赋予了特殊含义,用作专门用 ...

  3. js中typeof的使用方法

    typeof在js中是一个一元操作符,可以判断操作数的类型,其返回值为字符串,有number.string.object.boolean.function.undefined.使用方式可以是typeo ...

  4. 优秀的 HTML5 实战教程,提升你的综合开发能力

    HTML5 作为下一代网站开发技术,无论你是一个 Web 开发人员或者想探索新的平台的游戏开发者,都值得去研究.借助尖端功能,技术和 API,HTML5 允许你创建响应性.创新性.互动性以及令人惊叹的 ...

  5. Eclipse中的Web项目自动部署到Tomcat

    原因 很长时间没用Eclipse了,近期由于又要用它做个简单的JSP项目,又要重新学习了,虽然熟悉的很快,但记忆总是很模糊,偶尔犯错,以前很少写博客,现在感觉还是很有必要的,编程中每个人对于犯过的错误 ...

  6. Error: Error setting TTL index on collection : sessions

    Error: Error setting TTL index on collection : sessions 一.步骤一: 这个问题一般是直接升级 mongodb和connect-mongo的版本为 ...

  7. php扩展php_curl windows 安装问题

    关于安装php扩展php_curl 出现的提示错误,导致php_curl无法安装 apache 错误日志: PHP Warning: PHP Startup: in Unknown on line 0 ...

  8. AngularJS学习笔记之依赖注入

    最近在看AngularJS权威指南,由于各种各样的原因(主要是因为我没有money,好讨厌的有木有......),于是我选择了网上下载电子版的(因为它不要钱,哈哈...),字体也蛮清晰的,总体效果还不 ...

  9. SharePoint Online 创建门户网站系列之创建栏目

    前 言 SharePoint Online的栏目,简单描述即显示在首页上的各个模块信息,这里,我们主要介绍我们首页上的栏目,包括简介类型.新闻列表类型.图片类型: 下面,让我们开始在SharePoin ...

  10. POI中操作PPT获得每页的TABLE

    HSLFSlideShow slideShow = new HSLFSlideShow(bufferInputUtil.getBufferedInputStream()); logger.info(& ...