目前,我正在工作中使用期货进行异步线程处理。我希望它的功能类似于“cachedThreadPool”,但也要做这两件事:
每次线程成功完成时增加允许的最大线程数。
如果线程抛出异常或超时,则减少允许的最大线程数。
这可以在自定义中做到ThreadPoolExecutor
吗?我不熟悉以这种方式使用 Executors,因此将我指向正确的方向将非常有助于解决这个问题。
目前,我正在工作中使用期货进行异步线程处理。我希望它的功能类似于“cachedThreadPool”,但也要做这两件事:
每次线程成功完成时增加允许的最大线程数。
如果线程抛出异常或超时,则减少允许的最大线程数。
这可以在自定义中做到ThreadPoolExecutor
吗?我不熟悉以这种方式使用 Executors,因此将我指向正确的方向将非常有助于解决这个问题。
应该仔细考虑动态调整线程池的大小。如果您有超时并且您的响应是减少线程数,假设任务是可并行化的,那么它可能会使问题变得更糟。
无论如何,这里的代码会在任务引发异常时更改池的大小,并在任务成功完成时使其更大
class ManagedThreadPoolExecutor extends ThreadPoolExecutor {
@Override
protected void afterExecute(Runnable r, Throwable t) {
if(t != null)
setMaximumPoolSize(getMaximumPoolSize()-1);
else
setMaximumPoolSize(getMaximumPoolSize()+1);
}
}