package com.thread.test.thread;

 import java.util.Random;
import java.util.concurrent.*; /**
* CountDownLatch
* 同步策略 允许一个或多个线程等待一些列其它线程操作完成后执行
* 由给定count初始化
* await方法等待所有等待线程countDown方法执行之后释放
* count不能重置,只能使用一次 对比CyclicBarrier
* 多用途同步工具:
* 初始化为1的CountDownLatch可以作为 on/off开关;所有线程等待直到所有线程都执行了countDown gate效果
* 初始化为N....
*
* 必须等待所有线程都执行完成后才能让所有线程继续执行时其比较有用的特性
*
* Created by windwant on 2016/5/27.
*/
public class MyCountDownLatch { public static void main(String[] args) throws InterruptedException {
ExecutorService es = Executors.newCachedThreadPool();
CountDownLatch cd = new CountDownLatch(5);
Random r = new Random();
es.execute(new SubWork(cd, r.nextInt(10), "task1"));
es.execute(new SubWork(cd, r.nextInt(10), "task2"));
es.execute(new SubWork(cd, r.nextInt(10), "task3"));
es.execute(new SubWork(cd, r.nextInt(10), "task4"));
es.execute(new SubWork(cd, r.nextInt(10), "task5"));
cd.await();
es.execute(new MainWork());
es.shutdown();
} } class MainWork 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 SubWork implements Runnable{ private CountDownLatch cd; private int seconds; private String taskName; SubWork(CountDownLatch cd, int seconds, String taskName){
this.cd = cd;
this.seconds = seconds;
this.taskName = taskName;
} public void run() {
try{
System.out.println("subwork " + 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("subwork " + taskName + " over, executing time: " + TimeUnit.SECONDS.convert(d, TimeUnit.MILLISECONDS));
cd.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

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

Java并发之CountDownLatch 多功能同步工具类的更多相关文章

  1. Java并发之CyclicBarrier 可重用同步工具类

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

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

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

  3. 并发是个什么鬼之同步工具类CountDownLatch

    扯淡 写这篇文章,我先酝酿一下,实不相瞒,脱离底层太久了,更确切的情况是,真没曾认真研究过.就目前来说,很多框架包括工具类已经把实现封装的很深,你只需轻轻的调用一下API,便不费半点力气.以至于大家会 ...

  4. Java并发之同步工具类

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

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

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

  6. 同步工具类 CountDownLatch 和 CyclicBarrier

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

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

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

  8. Java并发之CountDownLatch

    CountDownLatch是Java concurrent包下的一个同步工具.它可以让一个(或多个)线程等待,直到其他线程中的某些操作完成. 本质上是一个信号量,我们把它比作一个有N个插销的大门,它 ...

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

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

随机推荐

  1. 【Java每日一题】20161107

    package Nov2016; import java.util.List; public class Ques1107 { public static void main(String[] arg ...

  2. objective-c 宏定义UIAlertController公用方法

    IOS的方法经常都有更迭,以前弹出框使用 AlertView,现在使用UIAlertController AlertView的宏定义 #define showMessage(__MESSAGE__) ...

  3. Scalaz(28)- ST Monad :FP方式适用变量

    函数式编程模式强调纯代码(pure code),主要实现方式是使用不可变数据结构,目的是函数组合(composability)最终实现函数组件的重复使用.但是,如果我们在一个函数p内部使用了可变量(m ...

  4. 当EL遇到char

    在EL表达式中,假设某个entity的status属性为char类型,此处假设为'1',在jsp中,对于${entity.status=='1'},我们预期的结果是true,但实际上是false - ...

  5. INFO: task java:27465 blocked for more than 120 seconds不一定是cache太大的问题

    这几天,老有几个环境在中午收盘后者下午收盘后那一会儿,系统打不开,然后过了一会儿,进程就消失不见了,查看了下/var/log/message,有如下信息: Dec 12 11:35:38 iZ23nn ...

  6. windows 7/10下安装oracle 10g

    有段时间没搞oracle了,最近要给别人在win 7下装个oracle 10g,特记录备忘下. 使用http://download.oracle.com/otn/nt/oracle10g/10201/ ...

  7. 基本I/O模型与Epoll简介

    5种基本的I/O模型:1)阻塞I/O ;2)非阻塞I/O; 3)I/O复用(select和poll);4)信号驱动I/O(SIGIO);5)异步I/O(POSIX.1的aio_系列函数). 操作系统中 ...

  8. Ajax关于readyState(状态值)和status(状态码)的研究

    var getXmlHttpRequest = function () { try{ //主流浏览器提供了XMLHttpRequest对象 return new XMLHttpRequest(); } ...

  9. [js开源组件开发]table表格组件

    table表格组件 表格的渲染组件,demo请点击http://lovewebgames.com/jsmodule/table.html,git源码请点击https://github.com/tian ...

  10. CSS的简介

    CSS(Cascading Style Sheets):层叠样式表 层叠:一层一层的 样式表:有很多的属性和属性值 css将网页内容和显示样式进行分离,提高了显示功能 CSS通常被称为CSS样式表或层 ...