Quartz一個job的執行過程

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啓動。

相關文章
相關標籤/搜索