有没有办法确定newFixedThreadPool队列中有多少runnables?

时间:2010-09-07 05:19:08

标签: java multithreading

我正在开火

Executors.newFixedThreadPool(100);
在一个主程序中,生产者的工作量比消费者能够跟上的速度要快。有没有办法查看newFixedThreadPool使用的基础无界队列中有多少项排队?

1 个答案:

答案 0 :(得分:4)

使用java.util.concurrent.ThreadPoolExecutor#getTaskCount获取线程池中的计划任务数。但请注意,这只是一个近似值,可能不准确。

如果要比生成器更快地解决生产者生成任务的问题,请在创建RejectedExecutionHandler时限制底层队列的大小并传入java.util.concurrent.ThreadPoolExecutor的一个实现。请参阅以下ThreadPoolExecutor文档中的代码段:

  

拒绝的任务

     

当Executor关闭时,以及当execute(java.lang.Runnable)对最大线程和工作队列容量使用有限边界并且已经饱和时,方法Executor中提交的新任务将被拒绝。在任何一种情况下,execute方法都会调用其RejectedExecutionHandler.rejectedExecution(java.lang.Runnable, java.util.concurrent.ThreadPoolExecutor)的{​​{1}}方法。提供了四种预定义的处理程序策略:

     
      
  1. 在默认的RejectedExecutionHandler中,处理程序在拒绝时会抛出运行时ThreadPoolExecutor.AbortPolicy
  2.   
  3. RejectedExecutionException中,调用execute本身的线程运行任务。这提供了一种简单的反馈控制机制,可以降低新任务的提交速度。
  4.   
  5. ThreadPoolExecutor.CallerRunsPolicy中,简单地删除了无法执行的任务。
  6.   
  7. ThreadPoolExecutor.DiscardPolicy中,如果执行程序未关闭,则删除工作队列头部的任务,然后重试执行(可能会再次失败,导致重复执行。)
  8.         

    可以定义和使用其他类型的ThreadPoolExecutor.DiscardOldestPolicy类。这样做需要一些小心,特别是当策略设计为仅在特定容量或排队策略下工作时。