场合
我的目标是
我的目标是避免悬挂/冻结。
我的猜测是可以通过限制同时计算的数量来完成(可能是NUMBER_OF_CPU_CORES - 1)
问题
实现这一目标的最佳方式是什么?
我知道有java.util.concurrent.Semaphore,但也许有更好的方法?
答案 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重载,该盒子也会挂起/冻结(除非它们的优先级已经提高)。可能很迟钝......