使用Java的CountDownLatch实现模拟并发请求

 * @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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值