当前位置: 首页 > 知识库问答 >
问题:

Java线程池执行器[提交超过MaxPoolsize]

阙弘博
2023-03-14

我有一个应用程序,允许用户批量向图像添加水印。该应用程序将只使用一个线程,并且一次只能添加一个水印。

我希望用户能够更改一次运行的水印任务[线程]的数量:可能在设置中为[1-5],并且我不能使用固定的ThreadPool,因为它具有固定的池大小。

我研究了如何使用线程池执行器(ThreadPoolExecutor)私有静态线程池执行器(ThreadPoolExecutor)=(ThreadPoolExecutor)执行器。newCachedThreadPool()

现在,当我尝试向最大池大小为3的执行者提交15个图像水印任务时,我得到以下例外:

Java语言util。同时发生的RejectedExecutionException:任务com。黑暗心理。zeondownloader。应用程序。主要的摄影工具。水印。BulkWatermarkTask$$Lambda$710/1861585081@1e2d8ad4从java拒绝。util。同时发生的ThreadPoolExecutor@24d02747[正在运行,池大小=3,活动线程=3,排队任务=0,已完成任务=0]

我希望ThreadPoolExecutor具有与fixedThreadPool相同的行为,在fixedThreadPool中,我可以拥有10个池大小,并且仍然可以提交任意多个任务,但我没有。我该怎么做呢?

共有1个答案

云星波
2023-03-14

查看JavaDoc会发现,这种行为是有意的。

当execute方法(java.lang.Runnable)中提交的新任务被关闭时,以及当executer对最大线程和工作队列容量使用有限边界且已饱和时,将拒绝这些任务。

因此,在您的情况下,您的队列似乎已满或不接受任何新项目。我还没有看到您实际上是如何创建ThreadPoolExecitor的,但我猜,您需要在构造函数中指定一个足够的BlockingQueue

编辑:这可能会发生,因为Executors.newCachedThreadPool()是无界的,如果没有可用的缓存线程,每次都会创建一个新线程。然而,设置最大池大小会干扰此操作,并且任务会通过Reject tedExecutionHandler被拒绝。

我目前无法再现该场景,但您可能可以将活动的AbortPolicy更改为ThreadPoolExecutor。CallerRunPolicy通过setRejectedExecutionHandler(ThreadPoolExecutor.CallerRunPolicy)调用。这将导致调用线程执行新任务,而不是引发异常

 类似资料:
  • 我正在使用线程池执行器更改遗留设计。详情如下:- 遗留:-对于遗留设计,在应用程序启动时创建600个线程。和放置在各种池中,然后在需要时提取这些池,并将任务分配给相应的线程。 新:-在新设计中,我将线程池替换为执行器服务 我观察到的是,对于Executor,在启动时不会创建线程。它们是在从客户端激发请求时创建的。因此,与前一个线程相比,在内存中创建的线程要少得多。 但我的问题是,这样做是否正确,因

  • Java SE6文档中的ThreadPoolExecutor类具有以下方法: 返回正在积极执行任务的线程的大致数目。 这里近似和积极执行是什么意思? 在调用之前、期间和之后,是否保证 null 我已经研究了线程池执行器监视需求,以及如何在java中判断线程池中是否有可用的线程,但它们没有回答我的查询。

  • 我使用线程池执行器,将其替换为旧版线程。 我创建了如下执行器: 这里的核心大小是maxpoolsize/5。我已经在应用程序启动时预先启动了所有核心线程,大约160个线程。 在传统设计中,我们创建并启动了大约670个线程。 但关键是,即使在使用Executor并创建和替换遗留设计之后,我们也不会得到更好的结果。 对于结果内存管理,我们使用Top命令来查看内存使用情况。对于时间,我们将System.

  • 我们有一个场景,提交给ThreadPoolExecitor的任务长时间运行。当线程池启动时,我们以核心池大小=5、最大池大小=20和队列大小为10启动它。在我们的应用程序中,大约有10个任务被提交。大多数时候,这些任务运行几分钟/小时,然后完成。但是有一种情况,所有5个任务都挂在I/O上。因此,我的核心池大小达到了最大值,但我的ThreadpoolExector队列未满。所以额外的5个任务从未有机

  • 我正在编写一个定制的ThreadPoolExecutor,具有以下额外功能:- > 如果有理想的线程,并且随着任务的到来,将该任务分配到队列中,而不是将其添加到队列中。 如果所有线程(最大池大小)都忙,则在新任务到来时,使用RejectionHandler的reject方法将它们添加到队列中 我已经重写了线程池执行程序的java 1.5版本的执行方法。 新守则如下:- 遗留代码如下所示:- 现在正

  • 我需要帮助设计基于多线程的应用程序,包括动态url创建和线程处理。 我在我的应用程序中使用了一个Spring调度器,它每30秒调度一次。从这个调度方法中,我调用了一些基于服务的api,它在循环中,而且我需要每个API有一个线程池执行器,上面有一个线程处理。 由于这个过程是从计划方法开始的,所以每次创建新的线程池时,这就是问题所在。你可以在代码中看到。 我想要的是,如果对于任何一个应用编程接口,如果