当前位置: 首页 > 面试题库 >

在具有等待任务的同时动态调整java.util.concurrent.ThreadPoolExecutor的大小

南门鸿哲
2023-03-14
问题内容

我正在与a
java.util.concurrent.ThreadPoolExecutor并行处理许多项目。尽管线程本身可以正常工作,但是由于线程中发生的动作,有时我们会遇到其他资源限制,这使我们想减少池中的线程数。

我想知道在线程实际工作时是否有办法降低线程数。我知道您可以调用setMaximumPoolSize()和/或setCorePoolSize(),但是它们仅在线程变为空闲时才调整池的大小,但是直到队列中没有任何任务等待时它们才变为空闲。


问题答案:

据我所知,这不可能是一种很好的清洁方式。

您可以实现beforeExecute方法来检查某些布尔值并强制线程暂时停止。请记住,它们将包含在重新启用它们之前不会执行的任务。

另外,您可以实现afterExecute在饱和时抛出RuntimeException。这将有效地导致线程死亡,并且由于执行器将超过最大值,因此不会创建新线程。

我也不建议您这样做。相反,尝试找到其他方法来控制导致您遇到问题的任务的并发执行。可能是通过在工作线程数量有限的单独线程池中执行它们来实现的。



 类似资料:
  • 在tkinter中调整窗口大小时,有没有办法动态调整小部件的大小? 这是代码: 当我调整窗口大小时,窗口小部件的宽度和高度保持不变。 我想要的是根据窗口的大小动态调整窗口小部件的大小。 有没有办法在tkinter中实现这一点? 如果有人能帮我,那就太好了。

  • 在C#中,我有以下两个简单的例子: 第一个示例创建一个打印“开始”的任务,等待5秒钟打印“完成”,然后结束任务。我等待任务完成,然后打印“全部完成”。当我运行测试时,它会按预期运行。 第二个测试应该具有相同的行为,只是由于使用了async和Wait,任务内部的等待应该是非阻塞的。但是这个测试只打印“开始”,然后立即打印“全部完成”和“完成”,永远不会打印。 我不知道我为什么会有这样的行为:S非常感

  • 我有一个递归函数,可以在并发队列上调度新任务。我想限制同时调度的任务的数量,所以我使用了一个信号量,这样每个任务都会等待它,直到旧线程结束并发出信号。 然而,我发现当运行线程达到最大数量(64个)时,队列会陷入死锁,并且它们都开始等待信号量。然后GCD不会启动新任务,即使它有很多挂起的队列。 我做错了什么?这是我的代码:

  • 我在网上搜索了很多关于vs await async,但是在这个特定的使用场景中,我并不真正理解其中的区别。我相信情况很简单。 vs. 其中,是一个异步方法,其中包含一些异步调用,例如使用wait调用db。 问题: 在这种情况下,两者之间有什么区别吗?任何帮助或意见,谢谢!

  • 我有这样的代码: 附言。这个例子是简化的,我有多个任务运行这样。因此,我正在寻找一个通用的解决方案,将为任何数量的任务工作

  • 使用asyn/wait vs wait有什么区别task.run() 等待任务。运行示例- 异步等待示例-