⌈Java⌋ 使用CountDownLatch实现发起高并发请求
2018-12-28 本文已影响1人
皓尘埃
单刀直入
void test() {
/**
* CountDownLatch在创建的时候需要传入一个大于或者等于的0的整数,该数会赋值给内部的一个计数器属性
* 当计数器大于0时,可以调用await()方法对当前线程造成等待
* 调用countDown()方法对计数器进行减一的操作
* 当计数器等于0时,所有被await()方法造成等待的线程会同时开始继续运行
*/
CountDownLatch countDownLatch = new CountDownLatch(1);
for (int i = 0; i < 10; i++) {
// 把CountDownLatch作为参数,创建好线程类并开启运行
new Thread(new MyThread(countDownLatch)).start();
System.*out*.println("创建好第"+i+"个线程。");
}
// 对计数器减一,使所有等待状态的线程继续运行
countDownLatch.countDown();
}
/**
* 创建一个实现Runnable接口的线程类,
* 定义一个用于接收实现等待的CountDownLatch类型的私有属性
*/
class MyThread implements Runnable {
private final CountDownLatch countDownLatch;
MyThread(CountDownLatch countDownLatch) {
this.countDownLatch = countDownLatch;
}
public void run() {
try {
// 在希望实现并发操作步骤之前调用await()实现等待
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
// 实现并发的操作
System.*out*.println(Thread.*currentThread*().getName() + " - " +System.*currentTimeMillis*());
}
}
输出日志
创建好第0个线程。
创建好第1个线程。
创建好第2个线程。
创建好第3个线程。
创建好第4个线程。
创建好第5个线程。
创建好第6个线程。
创建好第7个线程。
创建好第8个线程。
创建好第9个线程。
Thread-0 - 1545984867890
Thread-4 - 1545984867890
Thread-5 - 1545984867890
Thread-2 - 1545984867890
Thread-7 - 1545984867890
Thread-8 - 1545984867891
Thread-1 - 1545984867890
Thread-9 - 1545984867891
Thread-6 - 1545984867890
Thread-3 - 1545984867890
小结
当执行了countDownLatch.countDown()
之后,计数器由1变为0,同时就触发了多个之前被await
等待的线程同时执行,也就实现了瞬时的并发操作。