代码参考importNew上面的实例,做了优化,更便于理解
说明:CountDownLatch和CyclicBarrier底层都是通过计数器实现的
实例1,使用CountDownLatch模拟高并发
场景化:有一道阻塞墙,站着一个管理员,手里拿着N(线程数)个牌子,到达一个线程,把牌子给该线程,当手里牌子都发完时,打开墙门,放行所有线程通过
package com.xicheng.concurrent;
import java.util.concurrent.CountDownLatch;
/**
* @author xichengxml
* @date 2019/1/25 15:02
* 该类用于模拟高并发请求,参考文档
* @see <a href="http://www.importnew.com/30073.html"></a>
*/
public class MockMultiThreadController {
private static final int NUM = 5;
private static int count = 0;
public static void main(String[] args) {
CountDownLatch countDownLatch = new CountDownLatch(NUM);
System.out.println("Ready, Go!");
waitAllArrrived(countDownLatch);
try {
// 阻塞等待
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Finished");
}
/**
* @return
* 任务启动,到达一个计数减1,都到达后开启gate
*/
private static void waitAllArrrived(CountDownLatch countDownLatch) {
for (int i = 0; i < NUM; i++) {
Thread t = new Thread() {
@Override
public void run() {
try {
bizCode();
} catch (Exception e) {
e.printStackTrace();
} finally {
countDownLatch.countDown();
}
}
};
t.start();
}
}
/**
* 业务调用,对数字进行加1操作
*/
private static void bizCode() {
for (int i = 0; i < 10; i++) {
count++;
System.out.println("This is bizCode--" + i + "count:" + count);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
实例2:使用CyclicBarrier模拟高并发
场景化:有一道阻塞墙,墙上有个门,门上有N(线程数)把锁,每个线程持有一把钥匙,到达之后就打开自己的锁,全部锁打开后,门开启放行所有线程
package com.xicheng.concurrent;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
/**
* @author xichengxml
* @date 2019/1/25 17:00
* 使用cyclicbarrier模拟高并发请求
*/
public class MockMultiThreadController02 {
private static final int NUM = 5;
private static int count = 0;
public static void main(String[] args) {
Thread finishThread = new Thread(){
@Override
public void run() {
System.out.println("Finished");
}
};
System.out.println("Ready, Go!");
CyclicBarrier cyclicBarrier = new CyclicBarrier(NUM, finishThread);
waitAllArrrived(cyclicBarrier);
}
public static void waitAllArrrived(CyclicBarrier cyclicBarrier) {
for (int i = 0; i < NUM; i++) {
Thread t = new Thread() {
@Override
public void run() {
bizCode();
try {
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
};
t.start();
}
}
/**
* 业务调用,对数字进行加1操作
*/
private static void bizCode() {
for (int i = 0; i < 10; i++) {
count++;
System.out.println("This is bizCode--" + i + "count:" + count);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}