无论我设置池的大小,运行结果似乎都不会超过池大小。例如:
BlockingQueue<Runnable> queue = new LinkedBlockingQueue<>();
ThreadPoolExecutor executor = new ThreadPoolExecutor(8, 15, 1, TimeUnit.DAYS, queue);
executor.execute(new Runnable() {
public void run() {
}
});
当我设置8时,前8个结果将同步。但以下只是一个接一个地运行。
什么是错的以及如何解决?
答案 0 :(得分:2)
阅读the javadoc。
它说:
队列
任何BlockingQueue都可用于转移和保留提交的任务。此队列的使用与池大小调整相互作用:
如果正在运行的corePoolSize线程少于,则执行程序总是更喜欢添加新线程而不是排队。 如果corePoolSize或更多线程正在运行,则Executor总是更喜欢排队请求而不是添加新线程。 如果请求无法排队,则会创建一个新线程,除非它超过maximumPoolSize,在这种情况下,该任务将被拒绝。
[...]
无限队列。使用无界队列(例如,没有预定义容量的LinkedBlockingQueue)将导致新任务在所有corePoolSize线程忙时在队列中等待。因此,只会创建corePoolSize线程。