使用用Quartz作为项目的框架,现在有一个小的需求就是当Quartz的线程池中存在正在执行的线程时,系统需要控制不能再允许再使用quartz的任务。
核心就是获取Quartz的线程池;
Quartz 默认情况下使用SimpleThreadPool , 其中关键的属性有
private ThreadGroup threadGroup;
private final Object nextRunnableLock = new Object();
private List workers; //所遇的线程
private LinkedList availWorkers = new LinkedList();//空闲的线程
private LinkedList busyWorkers = new LinkedList();//运行中的线程
我们项目的调度器是StdScheduler ,由于用到的Field都是private 所有使用反射拿到 相关属性。
=========================================================
java.lang.reflect.Field schedField = org.quartz.impl.StdScheduler.class
.getDeclaredField("sched");
schedField.setAccessible(true);
org.quartz.core.QuartzScheduler quartzScheduler = (org.quartz.core.QuartzScheduler) schedField
.get(scheduler);
java.lang.reflect.Field resourcesField = org.quartz.core.QuartzScheduler.class
.getDeclaredField("resources");
resourcesField.setAccessible(true);
org.quartz.core.QuartzSchedulerResources qsRes = (org.quartz.core.QuartzSchedulerResources) resourcesField
.get(quartzScheduler);
org.quartz.simpl.SimpleThreadPool simpleThreadPool = (org.quartz.simpl.SimpleThreadPool) qsRes
.getThreadPool();
java.lang.reflect.Field busyWorkersField = org.quartz.simpl.SimpleThreadPool.class
.getDeclaredField("busyWorkers");
===============================================================