我们有一个场景,提交给ThreadPoolExecitor的任务长时间运行。当线程池启动时,我们以核心池大小=5、最大池大小=20和队列大小为10启动它。在我们的应用程序中,大约有10个任务被提交。大多数时候,这些任务运行几分钟/小时,然后完成。但是有一种情况,所有5个任务都挂在I/O上。因此,我的核心池大小达到了最大值,但我的ThreadpoolExector队列未满。所以额外的5个任务从未有机会运行。请建议我们如何处理这种情况?在这种情况下,使用较小的队列是更好的选择吗?初始化threadPool时的最佳队列大小是多少?
同样关于挂起的任务,我们有没有办法从线程池中取出线程?在这种情况下,至少其他任务会有机会运行。
我认为另一种方法是根据队列中等待的任务数设置corePoolSize。可以使用setCorePoolSize控制corePoolSize。示例监视器线程可以控制threadPoolExecutor。您还可以改进此监视器以调整并行度。
public class ExecutorMonitor extends Thread{
ThreadPoolExecutor executor = null;
int initialCorePoolSize;
public ExecutorMonitor(ThreadPoolExecutor executor)
{
this.executor = executor;
this.initialCorePoolSize = executor.getCorePoolSize();
}
@Override
public void run()
{
while (true)
{
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (executor.getQueue().size() > 0)
{
if(executor.getActiveCount() < executor.getMaximumPoolSize())
executor.setCorePoolSize(executor.getCorePoolSize() + 1);
}
if (executor.getQueue().size() == 0)
{
if(executor.getCorePoolSize() > initialCorePoolSize)
executor.setCorePoolSize(executor.getCorePoolSize() -1);
}
}
}
}
线程池执行器的Javadocs声明:
任何BlockingQueue都可用于传输和保存提交的任务。此队列的使用与池大小交互:
除非在5个线程“挂起”后超过队列大小,否则将无法获得更多线程。
真正的答案是:修复导致线程挂起的问题。否则,您将不得不实现一些方案,使用提交()
返回的Future
s来取消线程,如果它们运行时间太长。
整体情况是这样的:
core pool size = 5,
max pool size = 20 and
queue size of 10
提交10项任务。其中
因此,您的html" target="_blank">程序被挂起。
要了解有关ThreadPoolExecitor
动态的更多信息,请在此处观看。该文档的注意点如下:
EDIT
如果您希望增加核心池大小,那么您可以使用setCorePoolSize(int corePoolSize)。如果您增加corepoolsize
,那么如果需要,将启动新线程来执行任何排队的任务。
本文向大家介绍Spring线程池ThreadPoolExecutor配置并且得到任务执行的结果,包括了Spring线程池ThreadPoolExecutor配置并且得到任务执行的结果的使用技巧和注意事项,需要的朋友参考一下 用ThreadPoolExecutor的时候,又想知道被执行的任务的执行情况,这时就可以用FutureTask。 ThreadPoolTask 模拟客户端提交的线程 SPRIN
在我的项目中,我正在构建一个Java的执行框架,它接收来自客户端的工作请求。工作(大小不同)被分解为一组任务,然后排队等待处理。有单独的队列来处理每种类型的任务,每个队列都与一个ThreadPool相关联。ThreadPools的配置方式使引擎的整体性能达到最佳。 这种设计有助于我们有效地平衡请求的负载,大型请求不会占用系统资源。然而,当一些队列为空并且它们各自的线程池闲置时,该解决方案有时会变得
我正在使用线程池执行器更改遗留设计。详情如下:- 遗留:-对于遗留设计,在应用程序启动时创建600个线程。和放置在各种池中,然后在需要时提取这些池,并将任务分配给相应的线程。 新:-在新设计中,我将线程池替换为执行器服务 我观察到的是,对于Executor,在启动时不会创建线程。它们是在从客户端激发请求时创建的。因此,与前一个线程相比,在内存中创建的线程要少得多。 但我的问题是,这样做是否正确,因
我有一个类,它基本上会做两次相同的步骤。听起来像是一个在哪里多线程处理程序的完美例子。我的问题是,如果我只需要两个线程就可以做到这一点。以下是一般情况 我已经完成了第一部分——构建对象——的工作。我现在的问题是- 如何让主线程等待两个线程完成其第一部分?也许main会在两个对象上执行等待,然后在线程notifyAll之后,它们会在主线程上执行等待?但是线程如何抓住主线程呢?也许用这个 我怎样才能在
我有一个应用程序,允许用户批量向图像添加水印。该应用程序将只使用一个线程,并且一次只能添加一个水印。 我希望用户能够更改一次运行的水印任务[线程]的数量:可能在设置中为[1-5],并且我不能使用固定的ThreadPool,因为它具有固定的池大小。 我研究了如何使用线程池执行器(ThreadPoolExecutor)私有静态线程池执行器(ThreadPoolExecutor)=(ThreadPool
问题内容: 现在我想在进入for循环之前集中所有任务,但是当我运行此程序时,for循环会在此之前执行并引发此异常: 问题答案: 一种工作方式是,当您调用它时,它等待所有任务完成: 执行给定的任务,并在所有任务完成时返回保存其状态和结果的期货列表。Future.isDone()对于返回列表的每个元素为true。 请注意,已完成的任务可能已正常终止或引发了异常而终止 。如果在进行此操作时修改了给定的集