Java 如何在运行时获得石英线程池大小?
我有一个quartz-1.8.6/java应用程序,它正在使用默认的Java 如何在运行时获得石英线程池大小?,java,quartz,Java,Quartz,我有一个quartz-1.8.6/java应用程序,它正在使用默认的org.quartz.simplethreadpool,“org.quartz.threadPool.threadCount”(池中的工作线程数)设置为20 我希望在运行时定期轮询池中当前可用线程的数量,以便进行诊断,如果已耗尽(当前池大小为0)一段时间,请记录警告 如何在运行时访问池中当前可用线程数 SimpleThreadPool提供了一个方法getPoolSize(),根据javadoc(“获取线程池中的当前线程数”),该
org.quartz.simplethreadpool
,“org.quartz.threadPool.threadCount”
(池中的工作线程数)设置为20
我希望在运行时定期轮询池中当前可用线程的数量,以便进行诊断,如果已耗尽(当前池大小为0)一段时间,请记录警告
如何在运行时访问池中当前可用线程数
SimpleThreadPool
提供了一个方法getPoolSize()
,根据javadoc(“获取线程池中的当前线程数”),该方法将提供我要查找的信息。但是如何获取石英调度器使用的SimpleThreadPool
的引用呢
我按如下方式初始化quartz计划程序:
SchedulerFactory schedFact=new StdSchedulerFactory();
System.setProperty(StdSchedulerFactory.PROP_SCHED_INSTANCE_NAME,
本文件(名称);
System.setProperty(“org.quartz.threadPool.threadCount”,
“”+此.threadPoolSize);
scheduler=schedFact.getScheduler();
我想添加如下全局侦听器:
scheduler.addGlobalJobListener(新的JobListener(){
public void作业待执行(作业执行上下文){
调度器s=context.getScheduler();
//如何从调度程序获取对线程池的引用?
// --> ...
}
//其他JobListener接口方法
// ...
});
我在调度程序
中没有看到任何方法可以直接访问线程池
实例或池大小
属性。有办法吗
回答:
经过几次试验,我找到了我自己问题的答案,我想与大家分享:
- 正如我在下面的评论中提到的
实际上并不适用于我,因为在getPoolSize()
中实现时,它只返回与org.quartz.SimpleThreadPool
相同的值(池中的工作线程数),该值始终相同:threadCount
public int getPoolSize(){
返回getThreadCount();
}
/**
*
*设置池中的工作线程数-在
*已调用initialize()
。
*
*/
公共void setThreadCount(整数计数){
this.count=计数;
}
- 为我做这项工作的方法是
。返回列表的大小正是我所需要的。为了快速验证概念,我在调度程序中添加了以下全局侦听器以记录当前使用的线程数(注意:我在示例代码中使用QuartzScheduler.getCurrentlyExecutingJobs()
,有关更多信息,请参阅):io.vavr.control.Try
scheduler.addGlobalJobListener(新的JobListener(){
@凌驾
public void作业待执行(作业执行上下文){
调度器s=context.getScheduler();
JobDetail jd=context.getJobDetail();
//将原始泛型列表强制转换为列表以使stream()工作
TryI可以看到在QuartzScheduler类中有一个获取threadPoolSize的方法,它是调度器的具体实现。您需要获得该实例的挂钩。谢谢@user06062019。我原以为threadPoolSize对我有用,但在org.quartz.siml.SimpleThreadPool中实现时,它只返回线程数,这只是最大值m池中的工作线程数。因此此值将始终相同。对我有效的方法是QuartzScheduler.getCurrentlyExecutingJobs()返回列表的大小正是我所需要的。我可以看到QuartzScheduler类中有一个获取threadPoolSize的方法,它是调度器的具体实现。您需要获得该实例的挂钩。谢谢,@user06062019。我原以为threadPoolSize适合我,但在org.quartz.siml.SimpleThreadPool中实现了它只返回thread count,这是池中工作线程的最大数量。因此,该值始终相同。适合我的方法是QuartzScheduler.getCurrentlyExecutingJobs(),返回列表的大小正是我所需要的。