ThreadPoolExecutor从不运行超过poolize

时间:2015-11-18 07:35:41

标签: java threadpoolexecutor

无论我设置池的大小,运行结果似乎都不会超过池大小。例如:

 BlockingQueue<Runnable>  queue = new LinkedBlockingQueue<>();
 ThreadPoolExecutor executor = new ThreadPoolExecutor(8, 15, 1, TimeUnit.DAYS, queue);
 executor.execute(new Runnable() {
                public void run() {

                }
            });

当我设置8时,前8个结果将同步。但以下只是一个接一个地运行。
什么是错的以及如何解决?

1 个答案:

答案 0 :(得分:2)

阅读the javadoc

它说:

  

队列

     

任何BlockingQueue都可用于转移和保留提交的任务。此队列的使用与池大小调整相互作用:

     

如果正在运行的corePoolSize线程少于,则执行程序总是更喜欢添加新线程而不是排队。   如果corePoolSize或更多线程正在运行,则Executor总是更喜欢排队请求而不是添加新线程。   如果请求无法排队,则会创建一个新线程,除非它超过maximumPoolSize,在这种情况下,该任务将被拒绝。

     

[...]

     

无限队列。使用无界队列(例如,没有预定义容量的LinkedBlockingQueue)将导致新任务在所有corePoolSize线程忙时在队列中等待。因此,只会创建corePoolSize线程。