1

从 javadoc 为ThreadPoolExecutor

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

在这种情况下,我怎样才能让它ThreadPool启动新线程而不是将任务提交到队列?

例子:

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

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

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

4

3 回答 3

2

如果您想要一个具有最大大小的线程池,其中任务仅在所有线程都忙时才排队。

ExecutorService service = Executors.newFixedThreadPool(numberOfThreads);

缓存线程池,不会对任务进行排队,而是根据需要创建一个新线程。如果一个线程是空闲的,它将重新使用一个线程。

ExecutorService service = Executors.newCachedThreadPool();
于 2012-09-26T12:34:07.567 回答
2

我刚刚发布了这个确切的问题并在那里提供了答案:

如何让 ThreadPoolExecutor 在排队之前将线程增加到最大值?

很抱歉没有事先找到这个问题,否则我只会回答它。

总结答案,我扩展LinkedBlockingQueue它总是返回 false queue.offer(...),如果需要,它将向池中添加额外的线程。如果池已经处于最大线程并且它们都忙,RejectedExecutionHandler则将被调用。然后是处理程序put(...)进入队列。

我的答案中有示例代码。再次,对不起这个重复。

于 2013-10-22T21:34:17.993 回答
1

如果您想每次都启动新线程而不考虑空闲线程的可用性,那么您根本不需要 ThreadPool - 只需手动创建和启动新线程。这更好,因为您的线程在完成工作后会立即死亡,并且在 ThreadPool 中他们会等待一些时间来等待新工作但永远不会得到它,因此只会浪费内存。

于 2012-09-26T12:32:56.333 回答