//错误的写法
ForkJoinPool forkJoinPool = new ForkJoinPool(2);
forkJoinPool.execute(() -> {
for (int i = 0; i < 10; i++) {
linkageBusinessService.executeDelayedPatrolTask(configRespDTO);
}
});
//正确的写法1
ForkJoinPool forkJoinPool = new ForkJoinPool(2);
for (int i = 0; i < 10; i++) {
forkJoinPool.execute(() -> linkageBusinessService.executeDelayedPatrolTask(configRespDTO));
}
//正确的写法2
List<ForkJoinTask<Void>> tasks = new ArrayList<>();
for (int i = 0; i < 10; i++) {
tasks.add((ForkJoinTask<Void>)forkJoinPool.submit(() -> linkageBusinessService.executeDelayedPatrolTask(configRespDTO)));
}
ForkJoinTask.invokeAll(tasks);
public void executeDelayedPatrolTask(ConfigRespDTO configRespDTO) {
log.info("当前线程:{}", Thread.currentThread().getName());
log.info("开始对巡检联动任务进行延时启动入参:{}", configRespDTO);
if (!this.validateConfig(configRespDTO)) {
log.warn("巡检联动任务延时启动配置无效,无法延时启动任务");
return;
}
log.info("巡检联动任务进行延迟时间:{}秒", configRespDTO.getDelayTime());
int delayTimeMillis = configRespDTO.getDelayTime() * 1000;
try {
Thread.sleep(delayTimeMillis);
} catch (Exception e) {
Thread.currentThread().interrupt();
log.error("巡检联动任务进行延时启动报错:{}", e.getMessage());
return;
}
log.info("结束对巡检联动任务进行延时启动");
}
最一开始的写法是第一种 怎么调试都不太对,后边发现自己弄错了。循环只是执行了十遍里面的业务逻辑,日志打印始终是一个线程。
总结:要理清楚 一个task 是什么,执行这个task 的是谁。