JAVA中的CountDownLatch、CyclicBarrier、Semaphore的简单测试

时间:2025-03-15 14:35:25

因公司需要做一个对于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,执行完成!!!

相关文章