Java并发之CountDownLatch 多功能同步工具类
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 多功能同步工具类的更多相关文章
- Java并发之CyclicBarrier 可重用同步工具类
package com.thread.test.thread; import java.util.Random; import java.util.concurrent.*; /** * Cyclic ...
- Java多线程同步工具类之CountDownLatch
在过去我们实现多线程同步的代码中,往往使用join().wait().notiyAll()等线程间通信的方式,随着JUC包的不断的完善,java为我们提供了丰富同步工具类,官方也鼓励我们使用工具类来实 ...
- 并发是个什么鬼之同步工具类CountDownLatch
扯淡 写这篇文章,我先酝酿一下,实不相瞒,脱离底层太久了,更确切的情况是,真没曾认真研究过.就目前来说,很多框架包括工具类已经把实现封装的很深,你只需轻轻的调用一下API,便不费半点力气.以至于大家会 ...
- Java并发之同步工具类
1. CountDownlatch(计数器) 描述: 一个同步工具类,允许一个或多个线程等待其它线程完成操作 类图 通过指定的count值进行初始化,调用await方法的线程将被阻塞,直到count值 ...
- 《java并发编程实战》读书笔记4--基础构建模块,java中的同步容器类&并发容器类&同步工具类,消费者模式
上一章说道委托是创建线程安全类的一个最有效策略,只需让现有的线程安全的类管理所有的状态即可.那么这章便说的是怎么利用java平台类库的并发基础构建模块呢? 5.1 同步容器类 包括Vector和Has ...
- 同步工具类 CountDownLatch 和 CyclicBarrier
在开发中,一些异步操作会明显加快执行速度带来更好的体验,但同时也增加了开发的复杂度,想了用好多线程,就必须从这些方面去了解 线程的 wait() notify() notifyall() 方法 线程异 ...
- Java 并发包中的高级同步工具
Java 并发包中的高级同步工具 Java 中的并发包指的是 java.util.concurrent(简称 JUC)包和其子包下的类和接口,它为 Java 的并发提供了各种功能支持,比如: 提供了线 ...
- Java并发之CountDownLatch
CountDownLatch是Java concurrent包下的一个同步工具.它可以让一个(或多个)线程等待,直到其他线程中的某些操作完成. 本质上是一个信号量,我们把它比作一个有N个插销的大门,它 ...
- java 利用同步工具类控制线程
前言 参考来源:<java并发编程实战> 同步工具类:根据工具类的自身状态来协调线程的控制流.通过同步工具类,来协调线程之间的行为. 可见性:在多线程环境下,当某个属性被其他线程修改后,其 ...
随机推荐
- 当执行sudo时提示“is not in the sudoers file”的解决方案:
出现这种提示是由于普通用户帐号没有权限执行sudo命令,所以需要切换到root身份进行颁发权限: $su -(注意有- ,这和su是不同的,在用命令"su"的时候只是切换到root ...
- FancySelect – 更好用的 jQuery 下拉选择框插件
FancySelect 这款插件是 Web 开发中下拉框功能的一个更好的选择.FancySelect 使用方便,只要绑定页面上的任何 Select 元素,并调用就 .fancySelect() 就可以 ...
- [deviceone开发]-天气demo
一.简介 该demo主要实现定位功能,读取天气信息,语音播报功能.其中定位需要配置key,调试二维码请到论坛中下载! 二.效果图 三.相关讨论 http://bbs.deviceone.net/for ...
- [deviceone开发]-动画示例源码
一.简介 do_FrameAnimtionView组件是用加载GIF动态图片和加载一系列图片形成动画效果的展示组件,这个示例直观的展示组件基本的使用方式.适合初学者. 二.效果图 三.相关讨论 htt ...
- Spring(3)—— Junit框架单元测试
Junit主要用于单元测试,即白盒测试.它是一个开源的由JAVA开发的一个用于测试的框架. Junit的几个基本概念:TestCase,TestSuite,TestFixtrue TestCase:代 ...
- Android NDK环境搭建及调用JNI的简单步骤
转载请注明:http://www.cnblogs.com/tiantianbyconan/p/3396595.html Java Native Interface (JNI)标准是java平台的一部分 ...
- 怎么让一个项目里swift与OC可以兼容混合开发?
在苹果推出了swift语言之后,很多人担心OC很快会被取代,但是苹果方面表示2年内不会摒弃OC.但现在也快了啊.有的开发团队已经开始基于swift开发,但是有很多旧的框架还没来得及用swift写出来, ...
- AVAudioPlayer播放并实现了后台播放和远程控制
// ViewController.h #import <UIKit/UIKit.h> #import <AVFoundation/AVFoundation.h> @class ...
- MAVEN中的插件放在哪个dependcies里面
如果你用maven来管理项目的话,你会发现你要依赖很多plugin,于是引出了一个问题. 一个project中可能有两个<dependcies>这个tag, 如下 <dependci ...
- Loader加载器
今天学到了这个Loader,浅谈一下自己的看法: 1.定义 Loader是一个加载器,可以用来它访问数据,可以看做访问数据的机器(好比挖掘机).装再器从android3.0开始引进,它使得在activ ...