之前在Springboot学习笔记(一)-线程池的简化及使用中介绍了异步执行的用法, 这在Spring中也是适用的, 本文在其基础上新增几点说明:
ThreadPoolTaskExecutor
在提交完任务后不能直接shutdown()
–这与ThreadPoolExecutor
不同-- 否则会导致后续任务无法提交, 因为在Spring环境下, 为了节省资源, 一般都是共享一个执行器(比如@Async
的执行原理), 也就是说它是单例的, 如果确定只执行一次, 可以调用setWaitForTasksToCompleteOnShutdown(true);
方法等待任务完成再执行shutdown()
:ThreadPoolTaskExecutor executor = context.getBean(ThreadPoolTaskExecutor.class); executor.submit(() -> {}); executor.setWaitForTasksToCompleteOnShutdown(true); executor.shutdown();
- 相比
ThreadPoolExecutor
而言,ThreadPoolTaskExecutor
新增了回调机制, 分别包含成功回调和异常回调:executor.submitListenable(runnable).addCallback(res -> System.out.println("success"), Throwable::printStackTrace);