1、簡介多線程
我這裏的分析採用的是quartz-2.2.1的簡單配置。工具
1. 用的線程池是quartz自帶的org.quartz.simpl.SimpleThreadPool;線程
2. 採用org.quartz.impl.StdSchedulerFactory.getScheduler()來獲取Scheduler;對象
3. Job的存儲方案採用org.quartz.simpl.RAMJobStore;get
4. 採用org.quartz.impl.StdJobRunShellFactory. createJobRunShell()來獲得JobRunShell;class
5. 主線程org.quartz.core.QuartzSchedulerThread在初始化時被建立出來,一直等到關閉應用時纔會中止;thread
6. 採用org.quartz.core.JobRunShell運行Job;變量
7. 採用工具類org.quartz.core.QuartzSchedulerResources來存儲執行過程當中須要的對象,包括線程池(threadPool)、Job的存儲對象(jobStore)、獲取Job運行的工廠(jobRunShellFactory)等;sed
2、Job具體運行流程分析配置
1. org.quartz.core.QuartzScheduler.QuartzScheduler(QuartzSchedulerResources, long, long)在初始化時會生成主線程QuartzSchedulerThread並運行,代碼以下:
2. org.quartz.core.QuartzSchedulerThread.run():主線程(Job的啓動者)中是一個至關因而一個死循環,代碼以下:
只有當定時任務應用關閉時調用org.quartz.core.QuartzScheduler.shutdown(boolean)纔會中止,
org.quartz.core.QuartzSchedulerThread.halt(boolean);代碼以下:
(上述代碼中join()方法的調用時讓子線程執行完畢以後再往下執行,該句代碼的意義是等待全部的定時任務結束在中止應用程序)。
3.通過上面的分析咱們知道了,Job的啓動的由來,下面咱們具體分析一個job的運行過程。org.quartz.core.QuartzSchedulerThread.run()中,
該代碼片斷表示只有當paused=false時纔會往下執行,而要讓paused=false只有等到togglePause(false)被調用喚起,而Scheduler.start()會調用togglePause()調用。
org.quartz.core.QuartzSchedulerThread.run():
初始化JobRunShell,而後採用線程池運行JobRunShell。多線程部分的控制代碼以下:
org.quartz.simpl.SimpleThreadPool.runInThread(Runnable):
(1) 等待可用線程不爲空再往下執行;
(2) 從可用線程集合中取出一個線程並從中移除,並將該線程加入到忙碌線程集合中
(3) 調用org.quartz.simpl.SimpleThreadPool.WorkerThread.run(Runnable)方法:
這裏開啓一個JobRunShell,用runnabel這個變量進行控制。若是runnable不爲空,說明該線程正在運行。若是爲空往下執行將runnable賦值。賦值完以後,org.quartz.simpl.SimpleThreadPool.WorkerThread.run()監聽到,程序往下執行,代碼以下:
若是runnable爲空,則一直輪詢,等到runnbale不爲空,程序往下執行調用org.quartz.core.JobRunShell.run()。
job啓動。