因公司需要做一个对于CountDownLatch的分享,特写了此blog。

具体细节可以参见:小结java自带的跟锁相关的一些类

在做这个分享的过程中发现了Main和junit的运行的区别,在另外一个Blog细说。

详见:http://www.cnblogs.com/yangzhilong/p/6840791.html

 package com.yzl.dubbo;

 import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.Semaphore; /**
* 测试CountDownLatch、CyclicBarrier、Semaphore
* 这里的测试请在Main方法中进行测试,在junit会出现问题,原因是:junit是Daemon线程
*
* @author yangzhilong
*
*/
public class MyTest { public static void main(String[] args) {
MyTest myTest = new MyTest();
myTest.testCountDownLatch();
// myTest.testCyclicBarrier1();
// myTest.testCyclicBarrier2();
// myTest.testSemaphore();
} /**
* 测试CountDownLatch
*
*/
@org.junit.Test
public void testCountDownLatch(){
CountDownLatch latch = new CountDownLatch(5); Thread[] threads = new Thread[5];
Thread thread = null; System.out.println("begin.....................," + System.currentTimeMillis());
for (int i = 0; i < 5; i++) {
final int index = i;
thread = new Thread(()->{ System.out.println("Thread-" + index + ",准备执行!!!," + System.currentTimeMillis());
//计数器减一
latch.countDown();
try {
//等待计数器变成0
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread-" + index + ",开始执行!!!," + System.currentTimeMillis()); try {
Thread.sleep(new Random().nextInt(500));
} catch (InterruptedException e1) {
e1.printStackTrace();
} finally {
System.out.println("finally index:" + index);
}
System.out.println("Thread-" + index + ",执行完成!!!," + System.currentTimeMillis()); });
threads[i] = thread;
}
for (Thread t : threads) {
t.setDaemon(false);
t.start();
}
System.out.println("end..............," + System.currentTimeMillis());
} /**
* 测试CyclicBarrier-1
*/
@org.junit.Test
public void testCyclicBarrier1(){
CyclicBarrier cyclicBarrier = new CyclicBarrier(6); System.out.println("begin.....................," + System.currentTimeMillis());
for (int i = 0; i < 5; i++) {
final int index = i;
new Thread(()->{
System.out.println("Thread-" + index + ",准备执行!!!," + System.currentTimeMillis());
try {
cyclicBarrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println("Thread-" + index + ",开始执行!!!," + System.currentTimeMillis()); try {
Thread.sleep(new Random().nextInt(500));
} catch (InterruptedException e1) {
e1.printStackTrace();
}
System.out.println("Thread-" + index + ",执行完成!!!," + System.currentTimeMillis());
}).start();;
} try {
cyclicBarrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
} System.out.println("end..............," + System.currentTimeMillis());
} /**
* 测试CyclicBarrier-2
* 程序中会重置计数器
*/
@org.junit.Test
public void testCyclicBarrier2(){
CyclicBarrier cyclicBarrier = new CyclicBarrier(6); System.out.println("begin.....................," + System.currentTimeMillis());
for (int i = 0; i < 5; i++) {
final int index = i;
new Thread(()->{
System.out.println("Thread-" + index + ",准备执行!!!," + System.currentTimeMillis());
try {
cyclicBarrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println("Thread-" + index + ",开始执行!!!," + System.currentTimeMillis()); try {
Thread.sleep(new Random().nextInt(500));
} catch (InterruptedException e1) {
e1.printStackTrace();
} System.out.println("Thread-" + index + ",执行完成!!!," + System.currentTimeMillis());
}).start();;
} try {
cyclicBarrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
} System.out.println("end..............," + System.currentTimeMillis()); //重置计数器
cyclicBarrier.reset(); try {
cyclicBarrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println("我永远都不能被执行到");
} /**
* 测试Semaphore
*/
@org.junit.Test
public void testSemaphore(){
Semaphore semaphore = new Semaphore(1); System.out.println("begin.....................");
for (int i = 0; i < 5; i++) {
final int index = i;
new Thread(()->{
System.out.println("Thread-" + index + ",准备执行!!!," + System.currentTimeMillis());
try {
semaphore.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread-" + index + ",开始执行!!!"); try {
Thread.sleep(new Random().nextInt(500));
} catch (InterruptedException e1) {
e1.printStackTrace();
} System.out.println("Thread-" + index + ",执行完成!!!");
semaphore.release();
}).start();
}
System.out.println("end..............");
try {
Thread.sleep(100000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

运行结果:

begin.....................,1494483205995
end..............,1494483206092
Thread-0,准备执行!!!,1494483206094
Thread-2,准备执行!!!,1494483206094
Thread-3,准备执行!!!,1494483206094
Thread-4,准备执行!!!,1494483206094
Thread-1,准备执行!!!,1494483206094
Thread-1,开始执行!!!,1494483206094
Thread-2,开始执行!!!,1494483206095
Thread-0,开始执行!!!,1494483206095
Thread-3,开始执行!!!,1494483206095
Thread-4,开始执行!!!,1494483206095
finally index:4
Thread-4,执行完成!!!,1494483206260
finally index:1
Thread-1,执行完成!!!,1494483206390
finally index:0
Thread-0,执行完成!!!,1494483206483
finally index:3
Thread-3,执行完成!!!,1494483206548
finally index:2
Thread-2,执行完成!!!,1494483206567
begin.....................,1494483641348
Thread-0,准备执行!!!,1494483641454
Thread-1,准备执行!!!,1494483641454
Thread-2,准备执行!!!,1494483641454
Thread-3,准备执行!!!,1494483641455
Thread-4,准备执行!!!,1494483641455
end..............,1494483641455
Thread-1,开始执行!!!,1494483641456
Thread-0,开始执行!!!,1494483641456
Thread-2,开始执行!!!,1494483641456
Thread-3,开始执行!!!,1494483641456
Thread-4,开始执行!!!,1494483641456
Thread-3,执行完成!!!,1494483641502
Thread-0,执行完成!!!,1494483641509
Thread-4,执行完成!!!,1494483641545
Thread-1,执行完成!!!,1494483641564
Thread-2,执行完成!!!,1494483641692
begin.....................,1494483670144
Thread-0,准备执行!!!,1494483670268
Thread-1,准备执行!!!,1494483670268
Thread-2,准备执行!!!,1494483670268
Thread-3,准备执行!!!,1494483670268
Thread-4,准备执行!!!,1494483670268
Thread-4,开始执行!!!,1494483670269
Thread-3,开始执行!!!,1494483670269
Thread-2,开始执行!!!,1494483670269
Thread-0,开始执行!!!,1494483670269
Thread-1,开始执行!!!,1494483670269
end..............,1494483670269
Thread-3,执行完成!!!,1494483670399
Thread-2,执行完成!!!,1494483670404
Thread-1,执行完成!!!,1494483670486
Thread-0,执行完成!!!,1494483670536
Thread-4,执行完成!!!,1494483670553
begin.....................
Thread-0,准备执行!!!,1494483690182
end..............
Thread-0,开始执行!!!
Thread-1,准备执行!!!,1494483690183
Thread-2,准备执行!!!,1494483690183
Thread-3,准备执行!!!,1494483690184
Thread-4,准备执行!!!,1494483690184
Thread-0,执行完成!!!
Thread-1,开始执行!!!
Thread-1,执行完成!!!
Thread-2,开始执行!!!
Thread-2,执行完成!!!
Thread-3,开始执行!!!
Thread-3,执行完成!!!
Thread-4,开始执行!!!
Thread-4,执行完成!!!

JAVA中的CountDownLatch、CyclicBarrier、Semaphore的简单测试的更多相关文章

  1. Java并发编程工具类 CountDownLatch CyclicBarrier Semaphore使用Demo

    Java并发编程工具类 CountDownLatch CyclicBarrier Semaphore使用Demo CountDownLatch countDownLatch这个类使一个线程等待其他线程 ...

  2. 并发包下常见的同步工具类详解(CountDownLatch,CyclicBarrier,Semaphore)

    目录 1. 前言 2. 闭锁CountDownLatch 2.1 CountDownLatch功能简介 2.2 使用CountDownLatch 2.3 CountDownLatch原理浅析 3.循环 ...

  3. CountDownLatch/CyclicBarrier/Semaphore 使用过吗?

    CountDownLatch/CyclicBarrier/Semaphore 使用过吗?下面详细介绍用法: 一,(等待多线程完成的)CountDownLatch  背景; countDownLatch ...

  4. 并发包下常见的同步工具类(CountDownLatch,CyclicBarrier,Semaphore)

    在实际开发中,碰上CPU密集且执行时间非常耗时的任务,通常我们会选择将该任务进行分割,以多线程方式同时执行若干个子任务,等这些子任务都执行完后再将所得的结果进行合并.这正是著名的map-reduce思 ...

  5. Java中关于CountDownLatch的使用

    CyclicBarrier工具类主要是控制多个线程的一起执行,演示程序: import java.util.Random; import java.util.concurrent.CountDownL ...

  6. 用好Java中的枚举真的没有那么简单

    1.概览 在本文中,我们将看到什么是 Java 枚举,它们解决了哪些问题以及如何在实践中使用 Java 枚举实现一些设计模式. enum关键字在 java5 中引入,表示一种特殊类型的类,其总是继承j ...

  7. Java中的4个并发工具类 CountDownLatch CyclicBarrier Semaphore Exchanger

    在 java.util.concurrent 包中提供了 4 个有用的并发工具类 CountDownLatch 允许一个或多个线程等待其他线程完成操作,课题点 Thread 类的 join() 方法 ...

  8. 转发---[沧海拾遗]java并发之CountDownLatch、Semaphore和CyclicBarrier

    JAVA并发包中有三个类用于同步一批线程的行为,分别是CountDownLatch.Semaphore和CyclicBarrier. CountDownLatch CountDownLatch是一个计 ...

  9. 多线程中 CountDownLatch CyclicBarrier Semaphore的使用

    CountDownLatch 调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行.也可以传入时间,表示时间到之后,count还没有为0的时候,就会继续执行. package ...

随机推荐

  1. Java中线程池,你真的会用吗?

    在<深入源码分析Java线程池的实现原理>这篇文章中,我们介绍过了Java中线程池的常见用法以及基本原理. 在文中有这样一段描述: 可以通过Executors静态工厂构建线程池,但一般不建 ...

  2. cross validation笔记

    preface:做实验少不了交叉验证,平时常用from sklearn.cross_validation import train_test_split,用train_test_split()函数将数 ...

  3. vim去除行显示;vim全部复制命令

    行显示和隐藏: set nu set nu! 直接上命令: ggVG*y 解释一下上面的命令: ggVG   ——全选 *y  —— 复制到剪贴板 gg 是光标定位到文件首行 V  是进入可视模式 G ...

  4. J2ee高并发情况下监听器

    引言:在高并发下限制最大并发次数,在web.xml中用过滤器设置參数(最大并发数),并设置其它相关參数.具体见代码. 第一步:配置web.xml配置,不懂的地方解释一下:參数50通过參数名maxCon ...

  5. 【Android归纳】开发中应该注意的事项

    1.子线程中不能更新界面,更新界面必须在主线程中进行 2.Fragment注意的事项: a)  Activity调用Fragment中的方法 b)  Thread或者Handler调用Fragment ...

  6. WHY数学图形显示工具

    软件功能:输入一个二元数学表达式,含有两个参数变量X和Y,显示该数学表达式的三维图形. 很久之前就有写这个软件的想法,却一直没有激情和动力,终于在年假这两天完成了.以此软件纪念我那十几年前的高中生活, ...

  7. 简短介绍 C# 6 的新特性

    几周前我在不同的地方读到了有关C#6的一些新特性.我就决定把它们都收集到一起,如果你还没有读过,就可以一次性把它们都过一遍.它们中的一些可能不会如预期那样神奇,但那也只是目前的更新. 你可以通过下载V ...

  8. [NL系列] RNN & LSTM 网络结构及应用

    http://www.jianshu.com/p/f3bde26febed/ 这篇是 The Unreasonable Effectiveness of Recurrent Neural Networ ...

  9. Apache Mahout:适合所有人的可扩展机器学习框架

    http://www.ibm.com/developerworks/cn/java/j-mahout-scaling/ 在软件的世界中,两年就像是无比漫长的时光.在过去两年中,我们看到了社交媒体的风生 ...

  10. MySQL数据库localhost的root用户登陆遭遇失败

    问题:Access denied for user 'root'@'localhost' (using password: YES)打开MySQL目录下的my.ini文件(Linux的话是/etc/m ...