countDownLatch.await();

来源:2-4 并发模拟-代码

慕粉3495297

2018-07-21

http://img.mukewang.com/szimg/5b52dbac0001d87228801800.jpg最后一个log不会执行,前面的会执行,到countDownLatch.await();之后都不会执行,也没有抛出异常

写回答

2回答

Jimin

2018-07-21

你好,你少写了countDownLatch里特别关键的countDown方法的调用,导致主线程一直阻塞在await那里了。关于这个类的使用,后面课程里会有专门章节重点介绍。祝你学习愉快~

0
0

慕粉3495297

提问者

2018-07-21

具体代码如下

package com.mmall.concurrency;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

@Slf4j
public class ConcurrencyTest {
    // 请求总数
    public static int clientTotal = 5000;

    // 同时并发执行的线程数
    public static int threadTotal = 200;

    //计数值
    public static int count = 0;

    public static void main(String[] args) throws Exception {
        //线程池

        ExecutorService executorService = Executors.newCachedThreadPool();
        final Semaphore semaphore = new Semaphore(threadTotal);
        final CountDownLatch countDownLatch = new CountDownLatch(clientTotal);
        for (int i = 0; i < clientTotal; i++) {
            executorService.execute(() -> {
                try {
                    semaphore.acquire();
                    add();
                    log.info("count11:{}", count);
                    semaphore.release();
                } catch (Exception e) {
                    log.error("exception: ", e);
                }

            });`
        }
        countDownLatch.await();
        executorService.shutdown();
        log.info("count: {}", count);
    }

    public static void add() {
        count++;
    }
}


0
0

Java高并发编程,构建并发知识体系,提升面试成功率

构建完整并发与高并发知识体系,倍增高薪面试成功率!

3923 学习 · 832 问题

查看课程