Spring中的线程池
盘点Spring中的线程池,及如何在Spring异步任务使用自定义的线程池。
Spring中的内置线程池
SimpleAsyncTaskExecutor
实现了TaskExecutor
接口,为每个任务创建一个线程,并异步执行它,可以通过setConcurrencyLimit
设置最大的创建线程数,不适用大量执行时间短的任务。
SyncTaskExecutor
同步的,谁调用谁执行,一般用于测试。
1 | public void execute(Runnable task) { |
ConcurrentTaskExecutor
Executor的适配类,暴露出Spring的TaskExecutor类。不推荐直接使用。
ThreadPoolTaskExecutor
最常用,对java.util.concurrent.ThreadPoolExecutor
的包装,可以运行时指定线程池的大小。
Spring定时调度
定时调度的配置和使用
使用注解配置:
1 | @EnableAsync |
<task:*>
XML 命名空间中的功能。
1 | @Scheduled(cron = "0/5 * * * * ?") |
使用自定义线程池
默认情况下,Spring 将搜索关联的线程池定义:上下文中唯一的org.springframework.core.task.TaskExecutor
bean,或者名为“taskExecutor”的java.util.concurrent.Executor
bean。 如果两者都不可解析,则将使用org.springframework.core.task.SimpleAsyncTaskExecutor
来处理异步方法调用。 此外,具有void返回类型的带注释的方法不能将任何异常传输回调用者。 默认情况下,仅记录此类未捕获的异常。
实现org.springframework.scheduling.annotation.AsyncConfigurer:
1 |
|
继承AsyncConfigurerSupport:
同实现接口一样。
在spring容器中创建taskExecutor的bean:
1 | @Configuration |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 张国丰!
评论