如何解决Java ThreadPoolExecutor [提交的内容超过MaxPoolSize]
我有一个应用程序,允许用户批量向图像添加水印。该应用程序只会使用一个线程,并且一次只能添加一个水印。
我希望用户能够更改一次运行的水印的数量:任务[线程] :也许 [1-5] ,而且我不能使用fixedThreadPool,因为它具有固定的池大小。
我研究了使用 ThreadPoolExecutor strcpy()
,每次用户更改线程数量时,我都会调用 ThreadPoolExecutor 。 setMaxPoolSize ( newMaxThreadCount )。
现在,当我尝试向执行者提交说 15个图像水印任务时,最大池大小为 3 , 我收到以下异常:
java.util.concurrent.RejectedExecutionException:任务com.darkmental.zeondownloader.app.main.phototools.watermark.BulkWatermarkTask$$Lambda$710/1861585081@1e2d8ad4从java.util.concurrent.ThreadPoolExecutor拒绝@ 24d02747 [正在运行,池大小= 3,活动线程= 3,排队的任务= 0,已完成的任务= 0]
我希望 ThreadPoolExecutor 具有与 fixedThreadPool 相同的行为,其中池大小可以为 10 ,并且仍然可以提交 个任务,但我没有。我该怎么办?
解决方法
看看JavaDoc,表明此行为是有意的。
在执行器已关闭时,并且在执行器对最大线程数和工作队列容量使用有限范围时,将拒绝在方法execute(java.lang.Runnable)中提交的新任务。 ,并且已饱和。
因此,在您的情况下,您的队列似乎已满或不接受任何新项目。
我还没有看到您实际上是如何创建ThreadPoolExecutor
的,但是我想,您需要在构造函数中指定足够的BlockingQueue
。
编辑:可能会发生这种情况,因为Executors.newCachedThreadPool()
是无界的,并且如果没有可用的缓存线程,则每次都会创建一个新线程。但是,设置最大池大小会对此产生干扰,并且该任务会通过RejectedExecutionHandler
拒绝。
我目前无法重现该场景,但是您可能可以通过AbortPolicy
将活动的ThreadPoolExecutor.CallerRunsPolicy
更改为setRejectedExecutionHandler(ThreadPoolExecutor.CallerRunsPolicy)
。这导致调用线程执行新任务,而不是引发异常。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。