来自ThreadPoolExecutor
的javadoc:
在方法execute(java.lang.Runnable)中提交新任务时 ....如果有超过corePoolSize但小于 maximumPoolSize线程在运行时,只有在创建新线程时才会创建 队列已满。
在这种情况下,如何让ThreadPool
启动新线程而不是将任务提交到队列?
示例:
我有corePoolSize = 5和maxPoolSize = 10以及无界队列的线程。
假设 corePoolSize 线程正忙,并且新任务到达 - 池必须启动新线程并执行新任务。
假设 maxPoolSize 线程现在忙,并且新任务到达 - 池必须将任务持久化到队列中,并且第一个空闲线程必须执行此任务并执行。
答案 0 :(得分:2)
如果您想要一个具有最大大小的线程池,只有当所有线程都忙时,任务才会排队。
ExecutorService service = Executors.newFixedThreadPool(numberOfThreads);
缓存的线程池,它不会对任务进行排队,但会根据需要创建新线程。如果一个空闲,它将重新使用一个线程。
ExecutorService service = Executors.newCachedThreadPool();
答案 1 :(得分:1)
如果你想每次都启动新线程而不管空闲线程的可用性,那么根本不需要ThreadPool - 只需手动创建并启动新线程。这样做会更好,因为你的线程会在他们完成工作后立即死亡,而在ThreadPool中,他们会等待一段时间来完成新工作但却永远不会得到它,因此只会浪费内存。
答案 2 :(得分:1)
我刚刚发布了这个问题并在那里提供了答案:
How to get the ThreadPoolExecutor to increase threads to max before queueing?
很抱歉没有事先找到这个问题,否则我会回答它。
为了总结答案,我扩展LinkedBlockingQueue
使queue.offer(...)
始终返回false,如果需要,它将向池中添加一个额外的线程。如果池已经处于最大线程并且它们都忙,则将调用RejectedExecutionHandler
。然后是处理程序将put(...)
放入队列。
我的答案中有示例代码。再次,抱歉复制。