主要使用 Semaphore、CountDownLatch、AtomicInteger实现的
下面直接就粘贴代码
public static void main(String[] args) throws InterruptedException {
//创建线程池
ExecutorService executorService = Executors.newCachedThreadPool();
//最终执行成功次数
AtomicInteger atomicInteger = new AtomicInteger();
//总请求次数
int sum = 20000;
//同时最大请求数
int max = 100;
Semaphore semaphore = new Semaphore(max);
CountDownLatch countDownLatch = new CountDownLatch(sum);
for (int i = 0; i < sum; i++)
executorService.execute(() -> {
try {
//使线程阻塞等到线程满了再执行
semaphore.acquire();
//执行原子性的加一操作
atomicInteger.getAndIncrement();
//释放资源
semaphore.release();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
//使总数量减一
countDownLatch.countDown();
}
});
//线程阻塞,直到数据为0
countDownLatch.await();
executorService.shutdown();
System.out.println("count--->" + atomicInteger);
}