2010-09-07 67 views
0

我在主程序发射了有没有办法确定newFixedThreadPool队列中有多少个runnables?

Executors.newFixedThreadPool(100); 

和制片人在工作快于消费者能跟上抽。有没有办法查看newFixedThreadPool使用的基础无界队列中排队的项目数量?

+0

其值得注意的是,如果你的任务是CPU密集型你可能会发现,你有核的数量相匹配的线程池的性能会更好。但是,如果你的任务是IO绑定的(我怀疑他们是),你可能会发现缓存线程池最适合。 – 2010-09-07 06:28:22

+0

喜彼得,是任务都IO势必使头HTTP请求 – James 2010-09-07 18:37:16

回答

4

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

如果要解决生产者生产任务比消费者更快的问题,请限制底层队列的大小,并在创建java.util.concurrent.ThreadPoolExecutor时通过RejectedExecutionHandler的实现之一。见从ThreadPoolExecutor的文档下面的代码片段:

拒绝任务的当执行程序已关闭

的方法execute(java.lang.Runnable)提交的新任务将被拒绝,并且也当Executor使用的有限范围最大线程数和工作队列容量都是饱和的。在任一情况下,执行方法调用其RejectedExecutionHandlerRejectedExecutionHandler.rejectedExecution(java.lang.Runnable, java.util.concurrent.ThreadPoolExecutor)方法。提供四个预定义的处理程序策略:

  1. 在默认ThreadPoolExecutor.AbortPolicy,处理程序拒绝时抛出一个运行时RejectedExecutionException
  2. ThreadPoolExecutor.CallerRunsPolicy,调用执行自身的线程运行的任务。这提供了一个简单的反馈控制机制,可以减慢提交新任务的速度。
  3. ThreadPoolExecutor.DiscardPolicy,不能执行仅仅是被丢弃的任务。
  4. ThreadPoolExecutor.DiscardOldestPolicy,如果执行程序没有关闭,在工作队列头部的任务将被丢弃,然后执行重试(可再次失败,导致此重复。)

可以定义和使用其他种类的类。这样做需要特别注意,特别是在政策旨在仅在特定容量或排队策略下工作时。

+0

的感谢!我可以检查我的taskCount是否超过一定的尺寸,只是睡觉,直到消费者赶上? – James 2010-09-07 05:43:32

相关问题