【问题标题】:Limiting Total Threads in Multiple Executors限制多个执行程序中的总线程数
【发布时间】:2019-03-16 21:08:08
【问题描述】:

我有六个向外部服务器发送数据的进程。每个进程运行多个“传输”线程以提高性能和并行性(延迟、大文件等)。我每个进程有一个执行程序,每个进程最多 5 个线程。

现在,由于外部服务器仅支持 20 个线程,而我的进程尝试运行总共 30 个线程(6 个进程 x 每个 5 个线程),一些线程崩溃了。我明白了。

有没有办法在 Java 中创建一个“大线程池”(有 20 个线程)来将所有进程的总传输线程限制为最多 20 个?

另外,我正在考虑为所有进程创建一个单个执行器,但是一个进程可能会占用所有线程,而让其他进程处于饥饿状态。

【问题讨论】:

  • 进程,你的意思是每个都运行在自己的JVM中吗?
  • 不,所有进程都在同一个 JVM 中运行。它们也是实际的线程。
  • 线程不会崩溃。他们只会争夺资源。
  • 一个共享的、固定大小的 (20) 线程池执行器应该可以工作。每个进程可以有一个信号量来限制提交给执行者的并发任务的数量。
  • @Raedwald 不幸的是,当他们尝试打开与拒绝第 21 个外部服务器的连接时,它们崩溃了。

标签: java java-threads executor


【解决方案1】:

您可以使用单个执行程序并为您的流程实施bulkhead 模式。 例如,Hystrix 和 Resilience4j 都有现成的实现。

【讨论】:

  • 似乎正是我正在寻找的。我假设 Java 不提供任何标准实现,所以我需要实现它,对吧?
  • 您可以使用标准的 Java 对象(如锁、信号量或原子计数器)来实现它,或者您可以使用 3rd 方库。取决于您的任务和偏好。
  • 太好了,我想我将使用单个执行器而不是 6 个,并且将为每个进程使用一个信号量(大小为 5)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-28
相关资源
最近更新 更多