大年夜控制台输入的结不雅中我们可以看出所有的准时义务都是在同一个线程池用同一个线程来处理的,那么我们若何来并发的处理各准时义务呢,请持续向下看。
4. 多线程处理准时义务
"0 0 * * * *" 表示每小时0分0秒履行一次
(8)zone:时区,默认为当前时区,一般没有效到。
* <li>"0 0 * * * *" = the top of every hour of every day.</li>
看到控制台输出的结不雅,所有的准时义务都是经由过程一个线程来处理的,我估计是在准时义务的设备中设定了一个SingleThreadScheduledExecutor,于是我看了源码,大年夜ScheduledAnnotationBeanPostProcessor类开端一路找下去。不雅然,在ScheduledTaskRegistrar(准时义务注册类)中的ScheduleTasks中又如许一段断定:
- if (this.taskScheduler == null) {
- this.localExecutor = Executors.newSingleThreadScheduledExecutor();
- this.taskScheduler = new ConcurrentTaskScheduler(this.localExecutor);
- }
这就解释如不雅taskScheduler为空,那么就给准时义务做了一个单线程的线程池,正好在这个类中还有一个设置taskScheduler的办法:
* <li>"*/10 * * * * *" = every ten seconds.</li>
- public void setScheduler(Object scheduler) {
- Assert.notNull(scheduler, "Scheduler object must not be null");
- if (scheduler instanceof TaskScheduler) {
- this.taskScheduler = (TaskScheduler) scheduler;
- }
- else if (scheduler instanceof ScheduledExecutorService) {
- this.taskScheduler = new ConcurrentTaskScheduler(((ScheduledExecutorService) scheduler));
- }
- else {
- throw new IllegalArgumentException("Unsupported scheduler type: " + scheduler.getClass());
- }
- }
如许问题就很简单了,我们只需用调用这个办法显式的设置一个ScheduledExecutorService就可以达到并发的效不雅了。我们要做的仅仅是实现SchedulingConfigurer接口,重写configureTasks办法就OK了;
推荐阅读
【51CTO晃荡】8.26 带你深度懂得清华大年夜学、搜狗基于算法的IT运维实践与摸索 本文起首介绍非抢占式内核(Non-Preemptive Kernel)和可抢占式内核(Preemptive Kernel)的差别。接着分析L>>>详细阅读
地址:http://www.17bianji.com/lsqh/36757.html
1/2 1