watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGlhbmdydWkxOTg4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

package org.rui.thread.newc;

import java.util.Random;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit; /**
* Latch 锁存器
* 新类库中的构件 countDownLatch
*
* @author lenovo
*
*/
class TaskPortion implements Runnable { private static int counter = 0;
private final int id = counter++;
private static Random rand = new Random(47); private final CountDownLatch latch; public TaskPortion(CountDownLatch latch) {
this.latch = latch;
} @Override
public void run() {
try {
doWork();
latch.countDown();
} catch (InterruptedException e) {
// acceptable way to exit
} } // 处理业务代码
public void doWork() throws InterruptedException {
TimeUnit.MILLISECONDS.sleep(rand.nextInt(2000));
System.out.println(this + " 完毕");
} public String toString() {
return String.format("%1$-3d", id);
} } // waits on the countDownLatch
class WaitingTask implements Runnable {
private static int counter = 0;// 计数
private final int id = counter++;
private static Random rand = new Random(47); private final CountDownLatch latch; WaitingTask(CountDownLatch latch) {
this.latch = latch;
} @Override
public void run() {
try {
// 调用countDown()的任务在产生调用时并没有被堵塞。仅仅有对await的调用会被堵塞,直至计数值到达0
// 等待问题被解决的任务在这个锁存器上调用await(),将它们自已拦住,直至锁存器计数结束
latch.await();
System.out.println("latch 障碍被觉得 " + this);
} catch (InterruptedException e) {
System.out.println(this + " interrupted");
}
} public String toString() {
return String.format("waitingTask %1$-3d", id);
}
} /**
* TaskPortio将随机地休眠一段时间,以模拟这部分工作的完毕,而WaitingTask表示系统中等待的部分。它要等待到问题的初始部分成完为止。
* 全部的任务都使用了在main中定义同一个单一的counDownLacth
*
* @author lenovo
*
*/
public class CountDownLatchDemo {
static final int SIZE = 100; public static void main(String[] args) throws InterruptedException {
ExecutorService exec = Executors.newCachedThreadPool();
CountDownLatch latch = new CountDownLatch(SIZE); // 都必须共享一个countDownLatch对象
for (int i = 0; i < 10; i++) {
exec.execute(new WaitingTask(latch));// 这个要等待 latch上面的为0时才会运行
}
for (int i = 0; i < SIZE; i++) {
exec.execute(new TaskPortion(latch));
} // latch.await();
System.out.println("launched all tasks");
exec.shutdown();// quit when all task complete
} }
/**
output:
launched all tasks
43 完毕
95 完毕
99 完毕
36 完毕
94 完毕
11 完毕
....
12 完毕
1 完毕
27 完毕
98 完毕
13 完毕
72 完毕
71 完毕
2 完毕
45 完毕
92 完毕
31 完毕
14 完毕
17 完毕
6 完毕
97 完毕
....
80 完毕
....
56 完毕
85 完毕
61 完毕
30 完毕
....
3 完毕
93 完毕
81 完毕
78 完毕
73 完毕
44 完毕
82 完毕
49 完毕
64 完毕
83 完毕
16 完毕
latch 障碍被觉得 waitingTask 2
latch 障碍被觉得 waitingTask 0
latch 障碍被觉得 waitingTask 4
latch 障碍被觉得 waitingTask 1
latch 障碍被觉得 waitingTask 5
latch 障碍被觉得 waitingTask 3
latch 障碍被觉得 waitingTask 7
latch 障碍被觉得 waitingTask 6
latch 障碍被觉得 waitingTask 9
latch 障碍被觉得 waitingTask 8
*/

java 线程 新类库中的构件 countDownLatch 使用的更多相关文章

  1. Java多线程之新类库中的构件CountDownLatch

    使用CountDownLatch类 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 主要方法 public CountDownLatch(int count); ...

  2. Java多线程之新类库中的构件CyclicBarrier

    1.类说明: 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 Cycl ...

  3. Java多线程之新类库中的构件DelayQueue

    DelayQueue 是一个无界的BlockingQueue,用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走.这种队列是有序的,即队头对象的延迟到期时间最长.注意:不 ...

  4. Java多线程之新类库中的构件PriorityBlockingQueue

    package concurrent2; import java.util.ArrayList; import java.util.List; import java.util.Queue; impo ...

  5. Java线程新特征——Java并发库

    一.线程池   Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利.为了编写高效稳定 ...

  6. Java线程新特性--- Lock

    在Java5中,专门提供了锁对象,利用锁可以方便的实现资源的封锁,用来控制对竞争资源并发访问的控制,这些内容主要集中在java.util.concurrent.locks包下面,里面有三个重要的接口C ...

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

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

  8. Java: 线程池(ThreadPoolExecutor)中的参数说明

    最近在看<阿里巴巴Android开发手册>,里面有这样几句话: [强制]新建线程时,必须通过线程池提供(AsyncTask 或者ThreadPoolExecutor或者其他形式自定义的线程 ...

  9. Java多线程-新特性-线程池

    Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利.为了编写高效稳定可靠的多线程程序 ...

随机推荐

  1. 枚举类型互相转换(使用GetEnumName和TypeInfo两个函数)

    usesClasses,TypInfo ; typeTCommandType = (ctEmptyCommand,ctAdd,ctModify); TCommandTypeConvert=classp ...

  2. HDU 1535 Invitation Cards(SPFA,及其优化)

    题意: 有编号1-P的站点, 有Q条公交车路线,公交车路线只从一个起点站直接到达终点站,是单向的,每条路线有它自己的车费. 有P个人早上从1出发,他们要到达每一个公交站点, 然后到了晚上再返回点1. ...

  3. Android中获取IMEI码

    Imei = ((TelephonyManager) getSystemService(TELEPHONY_SERVICE)) .getDeviceId(); 1.加入权限 在manifest.xml ...

  4. TCP连接的建立(二)

    被动打开 SYN cookies TCP协议开辟了一个比較大的内存空间请求连接队列来存储连接请求块,当SYN请求不断添加,请求连接数目到达上限时,会致使系统丢弃SYN连接请求.SYN cookies技 ...

  5. Maven聚合

    <project xmlns="http://maven.apache.org/POM/4.0.0"  xmlns:xsi="http://www.w3.org/2 ...

  6. tomcat各版本和jsp、jstl、servlet的依赖关系(转)

    Servlet / JSP / Tomcat  Version  Servlet/ JSP    Tomcat  2.5/2.1 6.0.18 2.4/2.0 5.5.27 2.3/1.2 4.1.3 ...

  7. Mod in math

    An Introduction to Modular Math When we divide two integers we will have an equation that looks like ...

  8. java过滤html标签函数

    public static String Html2Text(String inputString) {              String htmlStr = inputString; //含h ...

  9. Unity学习笔记(二)——第一个Unity项目Hello Unity

    保留版权,转载请注明出处:http://blog.csdn.net/panjunbiao/article/details/9318811 在这一篇文章里,参照宣雨松的<Unity 3D游戏开发& ...

  10. FZU2177(dp)

    传送门:ytaaa 题意:有n个***(不能调换顺序),可以组成x(x<n)个炸弹,每个炸弹的威力为该组的(max-min)^2,现在给出n个***的威力值,求能组成所有炸弹的最大威力和. 分析 ...