因公司需要做一个对于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. 中文代码之Spring Boot集成H2内存数据库

    续前文: 中文代码之Spring Boot添加基本日志, 源码库地址相同. 鉴于此项目中的数据总量不大(即使万条词条也在1MB之内), 当前选择轻量级而且配置简单易于部署的H2内存数据库比较合理. 此 ...

  2. Newtonsoft.Json高级用法,json序列号,model反序列化,支持序列化和反序列化DataTable,DataSet,Entity Framework和Entity,字符串

    原文地址:https://www.cnblogs.com/yanweidie/p/4605212.html 手机端应用讲究速度快,体验好.刚好手头上的一个项目服务端接口有性能问题,需要进行优化.在接口 ...

  3. spring mvc 接受前台json @RequestBody json 属性 空 使用 JsonProperty spring mvc 获取json转乘bean

    请给json序列序列化成的javabean 属性加上   @JsonProperty(value = "real_name")   否则 springmvc 可能接受不到数据 ja ...

  4. 也给我的E420拆机清清灰尘

    用了两年,天气燥热,是得拆开清理下了,E430清理非常方便,拆开后面挡板就行,E420就麻烦很多,需要全部拆下,关于E420的拆机网上已经有非常详细的教程了,我这里做一些补充,有兴趣的同学欢迎参考. ...

  5. Spring配置中的"classpath:"与"classpath*:"的区别研究

    概念解释及使用场景: classpath是指WEB-INF文件夹下的classes目录. 通常我们一般使用这种写法实在web.xml中,比如spring加载bean的上下文时,如下: <!--系 ...

  6. Windows10系统.NET Framework 3.5离线安装方法

    Win10技术预览版给用户们带来很多新功能的同时,也给用户们带来了不害臊的麻烦与问题.其中.NET Framework 4.5是系统预装的,但是在Win10技术预览版中的部分应用需要.NET Fram ...

  7. 创建SQL作业错误的解决方法(不能将值 NULL 插入列 'owner_sid',表 'msdb.dbo.sysjobs';列不允许有空值。)

    在用SQL语句创建SQL Server作业时有时出现如下错误: 消息 515,级别 16,状态 2,过程 sp_add_job,第 137 行 不能将值 NULL 插入列 'owner_sid',表  ...

  8. android 数据加密——加密的概述

    数据加密又称密码学,它是一门历史悠久的技术,指通过加密算法和加密密钥将明文转变为密文,而解密则是通过解密算法和解密密钥将密文恢复为明文.数据加密目前仍是计算机系统对信息进行保护的一种最可靠的办法.它利 ...

  9. Android -- startActivityForResult和setResult

    startActivityForResult与startActivity的不同之处 startActivity( ) 仅仅是跳转到目标页面,若是想跳回当前页面,则必须再使用一次startActivit ...

  10. Topic Model的分类和设计原则

    Topic Model的分类和设计原则 http://blog.csdn.net/xianlingmao/article/details/7065318 topic model的介绍性文章已经很多,在 ...