.异步处理@Async
启动类加上@EnableAsync开启异步
springboot异步处理默认使用线程池SimpleAsyncTaskExecutor,该线程不复用,来一个任务创建一个线程于是可能引发OOM
平常开发一般使用ThreadPoolTaskExecutor处理流程:
1.查看核心线程池是否已满,不满就创建一条线程执行任务,否则执行第二步。
2.查看任务队列是否已满,不满就将任务存储在任务队列中,否则执行第三步。
3.查看线程池是否已满,即就是是否达到最大线程池数,不满就创建一条线程执行任务,否则就按照策略处理无法执行的任务。
如何等待最后一个任务执行完毕,对任务结果进行汇总处理。
方法一:使用自旋操作,等待任务结果返回。
//自旋锁,停止等待
while (true) {
if (future1.isDone() && future2.isDone()) {
log.info("Task1 result:{}", future1.get());
log.info("Task2 result:{}", future2.get());
break;
}
Thread.sleep(1000);
}
log.info("All tasks finished.");
方法二:使用CountDownLatch计数器
CountDownLatch latch = new CountDownLatch(2);
//参数是异步任务数量
每个异步任务的方法内部结束需要将计数器减1
latch.countDown();
主线程必须在启动其他线程后立即调用await()方法来阻塞主线程,直到其他线程完成各自的任务。
latch.await();