【问题标题】:Can Threadpoolexecutor switch its blockingQueue after start?Threadpoolexecutor启动后可以切换它的blockingQueue吗?
【发布时间】:2019-08-21 21:52:56
【问题描述】:

Threadpoolexecutor 启动后可以改变它的阻塞队列吗?我在我的进程中使用了多个线程池执行器。我不想在我的进程中违反超过一定数量的最大线程数。这就是为什么我想到了将我的线程池的阻塞队列切换到更繁忙的阻塞队列的想法。但是我在 ThreadpoolExecutor 类中看不到任何提供切换阻塞队列的功能的函数。这背后的原因可能是什么?

【问题讨论】:

  • “这背后的原因是什么?”在设计时它不被认为是有用的功能。我不判断它是否真的有用。 (但大概这个功能可以在 BlockingQueue 实现中处理,因此 TPE 也不需要处理它。)
  • 可能你需要使用公共池而不是多个读取池执行器。 docs.oracle.com/javase/8/docs/api/java/util/concurrent/…
  • @PratapiHemantPatel 这不是一个好的解决方案。我正在研究单体架构。不同的线程池用于写入不同的资源(socket、jms 和数据库)。如果我将使用相同的线程池来写入所有资源,那么可能是因为 db writes jms 事件会饿死。这不是一种理想的行为,因为订阅者正在等待 JMS 事件,而没有人会等待数据库写入。

标签: java concurrency threadpoolexecutor


【解决方案1】:

不可变对象通常在现代编程实践中受到青睐。它通常会使事情变得...在对象模型的增长和未来的增强方面更简单(不,为了争论,我不认为 python 的“让我们都成为负责任的成年人”的方法是现代的)。

至于解决您的问题,您可能会传递一个智能“委托”BlockingQueue 实现,该实现将实现标准接口,但使用一些队列切换机制支持它,根据您的规范要求在内部或外部进行控制

【讨论】:

    【解决方案2】:

    显然 threadpoolexecutor 允许访问其阻塞队列。我可以通过将任务从一个队列转移到另一个队列来实现相同的行为。

    【讨论】:

      猜你喜欢
      • 2011-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多