我在主程序发射了有没有办法确定newFixedThreadPool队列中有多少个runnables?
Executors.newFixedThreadPool(100);
和制片人在工作快于消费者能跟上抽。有没有办法查看newFixedThreadPool使用的基础无界队列中排队的项目数量?
我在主程序发射了有没有办法确定newFixedThreadPool队列中有多少个runnables?
Executors.newFixedThreadPool(100);
和制片人在工作快于消费者能跟上抽。有没有办法查看newFixedThreadPool使用的基础无界队列中排队的项目数量?
使用java.util.concurrent.ThreadPoolExecutor#getTaskCount
得到的线程池中计划任务数。但是,请注意,这只是一个近似值,可能并不准确。
如果要解决生产者生产任务比消费者更快的问题,请限制底层队列的大小,并在创建java.util.concurrent.ThreadPoolExecutor
时通过RejectedExecutionHandler
的实现之一。见从ThreadPoolExecutor
的文档下面的代码片段:
拒绝任务的当执行程序已关闭
的方法
execute(java.lang.Runnable)
提交的新任务将被拒绝,并且也当Executor
使用的有限范围最大线程数和工作队列容量都是饱和的。在任一情况下,执行方法调用其RejectedExecutionHandler
的RejectedExecutionHandler.rejectedExecution(java.lang.Runnable, java.util.concurrent.ThreadPoolExecutor)
方法。提供四个预定义的处理程序策略:
- 在默认
ThreadPoolExecutor.AbortPolicy
,处理程序拒绝时抛出一个运行时RejectedExecutionException
。- 在
ThreadPoolExecutor.CallerRunsPolicy
,调用执行自身的线程运行的任务。这提供了一个简单的反馈控制机制,可以减慢提交新任务的速度。- 在
ThreadPoolExecutor.DiscardPolicy
,不能执行仅仅是被丢弃的任务。- 在
ThreadPoolExecutor.DiscardOldestPolicy
,如果执行程序没有关闭,在工作队列头部的任务将被丢弃,然后执行重试(可再次失败,导致此重复。)可以定义和使用其他种类的类。这样做需要特别注意,特别是在政策旨在仅在特定容量或排队策略下工作时。
的感谢!我可以检查我的taskCount是否超过一定的尺寸,只是睡觉,直到消费者赶上? – James 2010-09-07 05:43:32
其值得注意的是,如果你的任务是CPU密集型你可能会发现,你有核的数量相匹配的线程池的性能会更好。但是,如果你的任务是IO绑定的(我怀疑他们是),你可能会发现缓存线程池最适合。 – 2010-09-07 06:28:22
喜彼得,是任务都IO势必使头HTTP请求 – James 2010-09-07 18:37:16