实习时被大佬问了一个问题,如何将一个foreach操作分别在不同线程中执行后同步聚集异步操作的结果,之后执行后面的操作以提升响应速度,当时上线问题还有一个没解决所以忙乱中只想出一个通过CountDownLatch(闭锁)的方法,之后仔细想了想至少有三种方法可以解决这个问题。
闭锁
第一种方式闭锁,不用多说,下面给出伪代码
public static void main(String[] args) throws Exception{
int threadPoolSize = 10;
ExecutorService executorService = Executors.newFixedThreadPool(10);
CountDownLatch countDownLatch = new CountDownLatch(threadPoolSize);
List<Object> aggregationResult = new ArrayList<>();
for (int i = 0; i < threadPoolSize; i++) {
executorService.execute(() -> {
// TODO 子结果计算
aggregationResult.add(子结果);
countDownLatch.countDown();
});
}
countDownLatch.await();
// 对聚合结果进行下一步操作
...
}
volatile类型的flag变量
第二中方式,使用线程安全的volatile类型的flag变量作为子任务计算是否完