启动新线程而不是放入队列

时间:2012-09-26 12:23:52

标签: java multithreading threadpool threadpoolexecutor

来自ThreadPoolExecutor的javadoc:

  

在方法execute(java.lang.Runnable)中提交新任务时   ....如果有超过corePoolSize但小于   maximumPoolSize线程在运行时,只有在创建新线程时才会创建   队列已满。

在这种情况下,如何让ThreadPool启动新线程而不是将任务提交到队列?

示例:

我有corePoolSize = 5和maxPoolSize = 10以及无界队列的线程。

假设 corePoolSize 线程正忙,并且新任务到达 - 池必须启动新线程并执行新任务。

假设 maxPoolSize 线程现在忙,并且新任务到达 - 池必须将任务持久化到队列中,并且第一个空闲线程必须执行此任务并执行。

3 个答案:

答案 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(...)放入队列。

我的答案中有示例代码。再次,抱歉复制。