我们有一个Web应用程序,允许用户触发对外部资源的请求。外部资源花费了不确定的时间来收集结果,因此我们必须轮询它以获取更新,并在完成后收集最终结果。
我们希望这样做,以便当用户触发请求时,它会被添加到队列中,然后许多工作线程将接收每个请求并进行轮询,同时用户执行其他操作。
由于请求的数量在白天变化很大,我们认为在很慢的情况下让很多工人无所事事会浪费资源,但与此同时我们需要有足够的工人来处理高峰期在系统上加载。
我们希望在有大量请求等待时可以添加更多工作人员,但在没什么可做的情况下杀掉工人。
可以使用EJB执行此操作,但我们不想使用它。我们也不想使用JMS或其他大型框架来处理这个问题,除非我们已经在使用它(Spring,Quartz,很多Apache的东西)。
由于EJB支持这一点,并且它是那里发现的更有用的功能之一,我们想象有人已经为我们解决了这个问题。建议
答案 0 :(得分:7)
使用具有核心和最大池大小的适当值的ThreadPoolExecutor
。
请记住,虽然拥有数百个空闲线程并没有太大的代价,所以你可以考虑使用Executors.newFixedThreadPool()
。
答案 1 :(得分:1)
来自java.util.concurrent.ThreadPoolExecutor
documentation:
如果池当前具有多个corePoolSize线程,则多余的线程如果空闲时间超过keepAliveTime,则将终止(请参阅getKeepAliveTime(java.util.concurrent.TimeUnit))。这提供了一种在不主动使用池时减少资源消耗的方法。如果池稍后变得更活跃,则将构造新线程。
所以,我建议你首先尝试Java标准库。您将不得不稍微调整一下参数,但线程池可以高度配置。