private TaskScheduler myThreadPoolTaskScheduler;
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
//简单粗暴的方式直接指定
//scheduledTaskRegistrar.setScheduler(Executors.newScheduledThreadPool(5));
//也可以自定义的线程池,方便线程的使用与维护,这里不多说了
scheduledTaskRegistrar.setTaskScheduler(myThreadPoolTaskScheduler);
}
}
@Bean(name = “myThreadPoolTaskScheduler”)
public TaskScheduler getMyThreadPoolTaskScheduler() {
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
taskScheduler.setPoolSize(10);
taskScheduler.setThreadNamePrefix(“Haina-Scheduled-”);
taskScheduler.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
//调度器shutdown被调用时等待当前被调度的任务完成
taskScheduler.setWaitForTasksToCompleteOnShutdown(true);
//等待时长
taskScheduler.setAwaitTerminationSeconds(60);
return taskScheduler;
}
方式二:方式一的本质改变了任务调度器默认使用的线程池,接下来这种是不改变调度器的默认线程池,而是把当前任务交给一个异步线程池去执行
-
首先使用@EnableAsync 启用异步任务
-
然后在定时任务的方法加上@Async即可,默认使用的线程池为SimpleAsyncTaskExecutor(该线程池默认来一个任务创建一个线程,就会不断创建大量线程,极有可能压爆服务器内存。当然它有自己的限流机制,这里就不多说了,有兴趣的自己翻翻源码~)
-
项目中为了更好的控制线程的使用,我们可以自定义我们自己的线程池,使用方式@Async(“myThreadPool”)
废话太多,直接上代码:
@Scheduled(fixedRate = 100010,initialDelay = 100020)
@Async(“myThreadPoolTaskExecutor”)
<