我正在开火
Executors.newFixedThreadPool(100);
在一个主程序中,生产者的工作量比消费者能够跟上的速度要快。有没有办法查看newFixedThreadPool使用的基础无界队列中有多少项排队?
答案 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}}方法。提供了四种预定义的处理程序策略:
- 在默认的
RejectedExecutionHandler
中,处理程序在拒绝时会抛出运行时ThreadPoolExecutor.AbortPolicy
。- 在
RejectedExecutionException
中,调用execute本身的线程运行任务。这提供了一种简单的反馈控制机制,可以降低新任务的提交速度。- 在
ThreadPoolExecutor.CallerRunsPolicy
中,简单地删除了无法执行的任务。- 在
醇>ThreadPoolExecutor.DiscardPolicy
中,如果执行程序未关闭,则删除工作队列头部的任务,然后重试执行(可能会再次失败,导致重复执行。)可以定义和使用其他类型的
ThreadPoolExecutor.DiscardOldestPolicy
类。这样做需要一些小心,特别是当策略设计为仅在特定容量或排队策略下工作时。