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(执行)十次sleep10000毫秒

2.2 定时任务线程池ScheduledExecutorService
- 通过
newScheduledThreadPool工厂实例化定时任务线程池 - 实现一个
Runnable()方法的匿名实现,任务为logger.debug("Hello ExecutorService"); - 调用
scheduledExecutorService的方法scheduleAtFixedRate,参数为:传入任务,延迟时间,时间间隔,数字单位:scheduledExecutorService.scheduleAtFixedRate(task, 10000, 1000, TimeUnit.MILLISECONDS); sleep10000毫秒

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(执行)十次sleep10000毫秒- 比JDK自带的线程池更灵活


最低0.47元/天 解锁文章
481

被折叠的 条评论
为什么被折叠?



