多线程api

//错误的写法
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 的是谁。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值