如何在 java 中动态调整缓存线程池的大小
How to dynamically resize a cached threadpool in java
我目前正在工作中使用 futures 进行异步线程处理。我希望它的功能与 '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);
}
}
我目前正在工作中使用 futures 进行异步线程处理。我希望它的功能与 '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);
}
}