0.使用CountDownLatch阻塞等待结果
1.使用CompletableFuture异步执行 并获取返回结果组合
public static void testCountDown() throws InterruptedException {
//自定义线程池
ThreadPoolExecutor executor = new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors() * 2, Runtime.getRuntime().availableProcessors() * 4, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(3000), new NamedThreadFactory("my-pool", false), (r, myExecutor) -> log.warn("线程池队列任务数已溢出,请及时处理"));
List<String> fromList = Arrays.asList("1", "2", "3", "4", "5", "6", "7", "8", "9", "10");
List<String> list = Collections.synchronizedList(new ArrayList<>());
int size = fromList.size();
CountDownLatch countDownLatch = new CountDownLatch(size);
for (int i = 0; i < size; i++) {
int num = i;
//实际上,CompletableFuture也使用了线程池来执行任务 ForkJoinPool最适合计算密集型任务,而且最好是非阻塞任务
CompletableFuture.supplyAsync(() -> {
String str = fromList.get(num);
System.out.println("执行完成 "+str);
return str;
}, executor).thenAccept(s -> {
list.add(s);
countDownLatch.countDown();
});
}
countDownLatch.await();
System.out.println(list);
System.out.println("任务结束");
}