ExecutorService pool = new ThreadPoolExecutor(budgetIds.size(), budgetIds.size(), 0L,
TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(128),
new ThreadPoolExecutor.CallerRunsPolicy());
List<Future<Map<String, Budget>>> futures = new ArrayList<>();
final CountDownLatch latch = new CountDownLatch(budgetIds.size());
try {
for (String budgetId : budgetIds) {
Future<Map<String, Budget>> submit = pool
.submit(new Callable<Map<String, Budget>>() {
@Override
public Map<String, Budget> call() {
try {
return queryBudgets(Lists.newArrayList(budgetId));
} finally {
latch.countDown();
}
}
});
futures.add(submit);
}
latch.await();
Map<String, Budget> resultBudgetMap = new HashMap<>();
for (Future<Map<String, Budget>> future : futures) {
//为了线程捕获异常
resultBudgetMap.putAll(future.get());
}
return resultBudgetMap;
} catch (Exception e) {
throw new PromoException(PromoErrorCodeEnum.UNKNOWN_EXCEPTION, e);
} finally {
pool.shutdown();
}