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

更改ThreadPoolExecutor的队列大小

蔚桐
2023-03-14

我需要能够更改ThreadPoolExecator的任务队列的大小。当然,BlockingQueue不支持更改大小,ThreadPoolExecitor不支持更改队列。

所以,我想到的方法是使用ThreadPoolExecutor。shutdownNow(),它返回了一个尚未执行的可运行程序列表。然后,我可以创建一个具有所需队列大小的新执行器,并重新提交所有任务。

问题是在shutdownNow()调用时正在进行的任务。根据javadoc,执行器将调用线程。当前执行taks的所有线程上的中断()。我不希望我的任务被扼杀。这个问题可能是一个冗长的问题,询问如何编写这样的线程。中断()不会有任何效果?

共有2个答案

邢寒
2023-03-14

您应该使用isTerminated()方法检查执行器状态,但请确保在调用isTerminated方法之前,您应该调用shutdown(),否则isTerminated方法将返回false。

巫培
2023-03-14

混合使用“shutdown()”(not shutdownNow()),然后使用getPoolSize()/isTerminated()进行轮询,您可以(a)停止现有池。然后(b)同时(在一个单独的线程中)可以创建一个具有所需大小的新队列。您可以在以下方面进行权衡:是否允许临时存在比所需数量更多的线程(当第一个池关闭时)。

 类似资料:
  • 如果正在运行的线程少于corePoolSize线程,则执行器宁愿添加一个新线程,而不是排队。2)如果corePoolSize或更多线程正在运行,则执行器更喜欢将请求排队,而不是添加新线程。 如果请求无法排队,将创建一个新线程,除非该线程将超过maximumPoolSize,在这种情况下,任务将被拒绝。 第一种情况是可以的,但我想要的是,当核心线程被利用时,任务不需要排队(即使在有界队列的情况下,比

  • 问题内容: 我正在学习 Java Concurrency in Practice, 并陷入了 8.3.1线程创建和拆除的 主题。以下脚注警告要保持为零。 有时,开发人员倾向于将核心大小设置为零,以使工作线程最终被拆除,因此不会阻止JVM退出,但这会在不使用a的线程池中引起一些奇怪的现象。他们的工作队列使用SynchronousQueue(就像newCachedThreadPool一样)。 如果池已

  • 问题内容: 我正在与Artemis作为新的JMS提供程序一起提供的WildFly 10.1一起工作,但是我无法找到如何动态更改特定MDB的使用者线程数的方法。 我有一个队列,还有一个使用队列中消息的消息侦听器(MDB),现在我想动态控制域必须启动的使用者线程的最大数量。 如何使用CLI做到这一点? 问题答案: 要动态更新池属性,可以看一下这篇文章,该文章描述了如何使用jboss- cli或stan

  • 我在这个问题上发现了一些类似的问题,但我想再问一遍,以便得到一个更明确的答案。我正在编写一个图匹配算法,其中图上的每个节点分配给一个优先级集,取决于其邻居的匹配。细节其实并不重要,但我使用了std::priority_queue以便首先匹配最高优先级的节点。这里有一个棘手的问题:每次引入一个新的匹配,匹配节点的邻居的优先级将被更新。 我的问题自然是,如何更新新匹配的顺序?我能强制执行吗?或者是否有

  • 问题内容: 我无法创建新线程。实际上,我编写了一个有点黑的程序,可以接受任何任务(即,它是不受限制的),但是调用了一个附加处理程序- 在我的应用程序中,它会发出警告跟踪表明该池已落后-这为我提供了TPE拒绝创建的非常明确的信息新队列,即使队列中有成千上万的条目。我的构造函数如下: 为什么不创建新线程? 问题答案: 此博客文章介绍了这一难题: 这种线程池的构造根本无法按预期工作。这是由于Thread