限制运行特定方法的线程数的最佳方法是什么?

时间:2012-03-17 02:06:35

标签: java multithreading concurrency

场合

  • 我有网络应用程序
  • 我有进行复杂数学计算的课程
  • 等式可以不时地发生,具体取决于什么是
  • 有时许多线程同时启动此计算
  • 当计算开始太多时,计算机将被挂起(完全冻结= 99 CPU使用率)

我的目标是

我的目标是避免悬挂/冻结。

我的猜测是可以通过限制同时计算的数量来完成(可能是NUMBER_OF_CPU_CORES - 1)

问题

实现这一目标的最佳方式是什么?

我知道有java.util.concurrent.Semaphore,但也许有更好的方法?

4 个答案:

答案 0 :(得分:7)

看看Java ThreadPoolExecutor这应该有助于您尝试做什么。

希望这会有所帮助......

答案 1 :(得分:2)

Semaphore看起来就像你想要的那样。

您可能想要输入一些逻辑,以便使用Semaphore.tryAcquire并在用户无法获取许可时向用户返回错误。如果您使用阻止acquire方法,那么您仍将使用已锁定的服务器。

答案 2 :(得分:2)

您应该将应用程序容器配置为限制为您需要的请求线程数。

除此之外,Semaphore是完美的工具。使用tryAcquire()方法,并确保在finally块中放置相应的版本,如下所示:

if (permits.tryAcquire(7, TimeUnit.SECONDS)) 
  try {
    /* Do your computation. */
    compute();
  } finally {
    permits.release();
  }
else 
  /* Respond with "Too busy; try later," message. */

答案 3 :(得分:0)

降低调用方法的线程的优先级。如果您的盒子上的其他应用程序不是CPU密集型的,这几乎不会影响您的计算,但对按键等的响应应该仍然很好。

实际上,我很惊讶即使是来自多个就绪线程的CPU重载,该盒子也会挂起/冻结(除非它们的优先级已经提高)。可能很迟钝......