我有一台使用Java executorService实现的服务器,其中有多个工作线程(即线程池)
我的问题是,如果线程池中没有可用的空闲线程,则无法每秒记录一次等待处理的作业的长度。
注意:日志记录不是我的问题,但是我希望能够看到有多少线程正在等待工作线程处理,无论如何,执行者服务中是否有等待队列(不是线程池)的长度? ?
我不知道如何实现这一目标。
该ThreadPoolExecutor
构造函数接受一个BlockingQueue
参数,它是Queue
用来存储等待处理的作业执行。您可以使用getQueue()
方法请求此队列,然后检查队列的大小:
System.out.println("Number of waiting jobs: "+executor.getQueue().size());
请注意,此方法在ExecutorService
界面中不可用,因此最好构造ThreadPoolExecutor
显式而不是使用Executors.newFixedThreadPool
和朋友:
ThreadPoolExecutor executor = new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
尽管Executors.newFixedThreadPool
在OpenJDK / OracleJDK中也这样做,但未指定它,因此使用(ThreadPoolExecutor)Executors.newFixedThreadPool(nThreads)
可能会ClassCastException
在将来的Java版本或替代的JDK实现中引起。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句