* @Title: annotation-test
* @Description: com.example.annotationtest.testCountDownLanch
* @Auther: liuhr
* @Date: 2020-10-30 14:35
*/
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @description: 测试countDownLauch
* @author: liuhr
* @time: 2020-10-30 14:35
*/
public class TestCDL {
//创建一个方法, 这个方法是从一个堆积了10000条的队列当中一次性处理1000个任务
public static void testOver10000Task(){
//创建完成1000个任务之后归零
final CountDownLatch createLatch = new CountDownLatch(1000);
//执行完1000个任务之后归零
final CountDownLatch overLatch = new CountDownLatch(1000);
//总线程数
AtomicInteger taskNumber = new AtomicInteger(1000);
//创建线程池可以同时运行50个线程
ExecutorService executorService = Executors.newFixedThreadPool(50);
long startTime = System.currentTimeMillis();
for (int j = 0; j < taskNumber.get(); j++) {
//循环创建1000个线程任务
executorService.submit(()->{
try {
//创建完了子线程阻塞
createLatch.await();
//线程唤醒之后进行共享变量的增加
taskNumber.decrementAndGet();
//线程任务执行完成之后overLatch减一
overLatch.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
});
createLatch.countDown();
}
try {
//完成1个任务就阻塞在这一次
overLatch.await();
//完成1000个就打印一次
System.out.println("taskNumber = " + taskNumber + "用时:" + (double)(System.currentTimeMillis() - startTime )/1000 + "秒");
} catch (InterruptedException e) {
e.printStackTrace();
}
executorService.shutdown();
}
public static void main(String[] args) {
testOver10000Task();
}
}
```java
使用Java的CountDownLatch实现模拟并发请求
最新推荐文章于 2024-04-27 01:49:11 发布
关键词由CSDN通过智能技术生成