当某项工作需要由若干项子任务并行地完成,并且只有在所有的子任务结束之后(正常结束或者异常结束),当前主任务才能进入下一阶段,CountDownLatch工具将是非常好用的工具,并且其所提供的操作方法还是线程安全的。
try {
final CountDownLatch latch = new CountDownLatch(factorIndexList.size());
//多线程执行同步任务
for (String factorIndex : factorIndexList) {
poolTaskExecutor.execute(() -> {
log.info("[quantization] historyFactorDataToEs synchronize factor index:{}",factorIndex);
try {
historyFactorDataToEs(synchronizeStartDate,synchronizeEndDate,factorIndex);
} catch (Exception e){
log.error("[quantization] historyFactorDataToEs factorIndex:{}, error:{}",factorIndex, e);
}finally {
latch.countDown();
}
});
Thread.sleep(2000);
}
//阻塞当前主线程直到latch中的值为0
latch.await();
//打印日志,记录当前索引,监测因子已执行完毕
for (String factorSecondType : factorIndexList){
QuantizationFactorToEsErrorRecodeDO toEsErrorRecodeDO = new QuantizationFactorToEsErrorRecodeDO();
toEsErrorRecodeDO.setFactorSecondType(factorSecondType);
toEsErrorRecodeDO.setDate(DateUtil.getDateToString(new Date(),"yyyy-MM-dd HH:mm:ss"));
toEsErrorRecodeDO.setErrorLevel(ErrorEnum.ERROR_THROW.getCode());
quantizationFactorToEsRecodeService.insertFactorToEsRecode(toEsErrorRecodeDO);
}
log.info("[quantization] doSynchronizeHistoryData end---------------");