
ExecutorService
ScheduledExecutorService
ThredPoolTaskExecutor
ThredPoolTaskScheduler
Spring Quartz
1. 分布式换环境下的定时任务问题
Schedule每隔一段时间做同样的事情,做的任务会重复
Quartz定时任务驱动的参数存到数据库里,通过排队加锁等这样的机制实现共享
2. JDK线程池
注意:main方法的线程如果不挂掉会一直等着它执行,但是juint方法中线程如果后面没有逻辑立马就结束了。解决方法启动之后等一下,让当前线程阻塞一会,但是sleep方法又经常抛异常,为了调起来方便把sleep封装一下
private void sleep(long m) {
try {
Thread.sleep(m);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
2.1 普通线程池 ExecutorService
- 通过
newFixedThreadPool
工厂实例化普通线程池 - 实现一个
Runnable()
方法的匿名实现,任务为logger.debug("Hello ExecutorService");
submit
(执行)十次sleep
10000毫秒
2.2 定时任务线程池ScheduledExecutorService
- 通过
newScheduledThreadPool
工厂实例化定时任务线程池 - 实现一个
Runnable()
方法的匿名实现,任务为logger.debug("Hello ExecutorService");
- 调用
scheduledExecutorService
的方法scheduleAtFixedRate
,参数为:传入任务,延迟时间,时间间隔,数字单位:scheduledExecutorService.scheduleAtFixedRate(task, 10000, 1000, TimeUnit.MILLISECONDS);
sleep
10000毫秒
3. Spring线程池
3.1 配置文件 application.properties
3.1.1 普通线程池
core-size
:核心线程数量max-size
:自动扩容上限queue-capacity
:队列容量,最大容量也不够用时,放入队列进行缓冲
# TaskExecutionProperties
spring.task.execution.pool.core-size=5
spring.task.execution.pool.max-size=15
spring.task.execution.pool.queue-capacity=100
3.1.2 定时任务线程池
size
:线程数量
# TaskSchedulingProperties
spring.task.scheduling.pool.size=5
3.2 配置类 ThreadPoolConfig
@Configuration
@EnableScheduling
@EnableAsync
public class ThreadPoolConfig {
}
3.3 Spring普通线程池:ThreadPoolTaskExecutor
- 注入普通线程池
ThreadPoolTaskExecutor
- 实现一个
Runnable()
方法的匿名实现,任务为logger.debug("Hello ExecutorService");
submit
(执行)十次sleep
10000毫秒- 比JDK自带的线程池更灵活
</