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启动。

相关文章
相关标签/搜索