title: quartz源碼分析——執行引擎和線程模型
date: 2017-09-09 23:14:48
categories: quartz
tags: [quartz, 源碼分析]
軟件版本:quartz-2.2.3
序
上一篇介紹了quartz的啟動過程,這篇主要介紹quartz的執線程模型,眾所周知,quartz並沒有采用定時器去完成定時任務,而是通過線程去完成。為了簡化對quartz線程模型的理解,就暫用下理解方式吧
| 類名 | 名詞解釋 |
|-
| SimpleThreadPool| 工頭兒 |
| WorkThread| 工人 |
| QuartzScheduleThread| 老板 |
| JobRunShell | 工作,實現了Runnable|
從配置說起
從上述配置文件可以看出quartz配置了一個線程池,實現名稱為SimpleThreadPool, 這個線程池作用是什么呢,我把注釋寫在代碼中。
SimpleThreadPool——quartz里的工頭兒
以上是這個類的成員變量,從上面的成員變量可以看出,這個線程池用LinkedList存儲執行所有job的工人(Worker),來管理了所有的工人(Worker),那么我們就叫SimpleThreadPool為工頭兒吧,老板要分派任務,肯定會找工頭兒,工頭在找空閑的工人來處理工作。
那工頭對老板提供的接口是什么呢,繼續往下看
上面的runInThread 就是工頭對老板提供的對外接口,Runnable就是老板安排的工作,流程是這樣的:
WorkerThread——quartz里的工人
介紹了工頭,再來介紹一下工人,工頭兒通過調用work.run方法,工人就開始工作了
開一下代碼
工頭把任務交給工人,工人線程此時阻塞,當runnable被賦值時,工作線程被喚醒。流程圖如下:
QuartzSchedulerThread——Quartz里面的老板
QuartzSchedulerThread是quartz里真正負責時間調度的類,這個線程的run方法也是最外層的loop。主要負責任務觸發,工作包裝,任務批處理的控制,這個方法是本章最難的一個方法了,看一下主loop
boss線程涉及的細節非常多,看一下流程圖
上面的流程介紹的差不多了,建議對着代碼看流程,有助於理解。
線程模型圖
一圖以概之
以上是自己的一家之言,若有錯誤之處,請不吝賜教,共同提高。