工作中经常涉及异步任务,通常是使用多线程技术,比如线程池ThreadPoolExecutor,它的执行规则如下:
在Springboot中对其进行了简化处理,只需要配置一个类型为java.util.concurrent.TaskExecutor或其子类的bean,并在配置类或直接在程序入口类上声明注解@EnableAsync
。
调用也简单,在由Spring管理的对象的方法上标注注解@Async
,显式调用即可生效。
一般使用Spring提供的ThreadPoolTaskExecutor类。
声明
@Configuration
@EnableAsync
public class BeanConfig {
<span class="hljs-meta">@Bean</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> TaskExecutor <span class="hljs-title">taskExecutor</span><span class="hljs-params">()</span> </span>{
ThreadPoolTaskExecutor executor = <span class="hljs-keyword">new</span> ThreadPoolTaskExecutor();
<span class="hljs-comment">// 设置核心线程数</span>
executor.setCorePoolSize(<span class="hljs-number">5</span>);
<span class="hljs-comment">// 设置最大线程数</span>
executor.setMaxPoolSize(<span class="hljs-number">10</span>);
<span class="hljs-comment">// 设置队列容量</span>
executor.setQueueCapacity(<span class="hljs-number">20</span>);
<span class="hljs-comment">// 设置线程活跃时间(秒)</span>
executor.setKeepAliveSeconds(<span class="hljs-number">60</span>);
<span class="hljs-comment">// 设置默认线程名称</span>
executor.setThreadNamePrefix(<span class="hljs-string">"hello-"</span>);
<span class="hljs-comment">// 设置拒绝策略</span>
executor.setRejectedExecutionHandler(<span class="hljs-keyword">new</span> ThreadPoolExecutor.CallerRunsPolicy());
<span class="hljs-comment">// 等待所有任务结束后再关闭线程池</span>
executor.setWaitForTasksToCompleteOnShutdown(<span class="hljs-keyword">true</span>);
<span class="hljs-keyword">return</span> executor;
}