[英]Java change worker threads amount
我正在使用ExecutorService创建一个固定的线程池并启动几个工作线程,这些线程监听发生的事情,然后完成他们的工作。 但有时我想增加或减少同时运行的线程数量,以便微调应用程序的性能(无需重新启动应用程序或终止任何当前运行的线程)。 我应该创建自己的线程池,还是有办法让一个池的大小改变,以便在必要时处理工作人员的开始/停止。
但有时我想增加或减少同时运行的线程数量,以便微调应用程序的性能(无需重新启动应用程序或终止任何当前运行的线程)。
如果你的意思是使用某种工具或其他东西动态更改,那么我不确定,但你可以设置一些代码逻辑来控制。
您可以使用java.util.concurrent.ThreadPoolExecutor
并使用CorePoolSize
和MaxPoolSize
属性来控制线程池 。
corePoolSize和maximumPoolSize:
但在您决定之前,我建议您阅读以下摘自ThreadPoolExecutor的 Java文档的摘录。
但是, 程序员被要求使用更方便的Executors工厂方法Executors.newCachedThreadPool()(无界线程池, 具有自动线程回收 ),Executors.newFixedThreadPool(int)(固定大小线程池)和Executors.newSingleThreadExecutor()(单个背景) thread),为最常见的使用场景预配置设置。
代码示例:
请参考下面的代码示例。 通过阅读代码和浏览Java文档,您可以理解大多数事项。 然而,事实可能并不明显
ArrayBlockingQueue
获取20个容量的有界队列( 您可以根据需要决定队列容量 )。 因此,一旦队列中有超过20个任务等待,将创建新线程但最多为maxPoolSize 。 您可以阅读ThreadPoolExecutor的 “排队”部分,并根据您的要求决定其他一些队列。
ThreadPoolExecutor.setCorePoolSize(INT)
设置核心线程数。 这将覆盖构造函数中设置的任何值。 如果新值小于当前值,则当下一个空闲时, 多余的现有线程将被终止 。 如果需要更大,则新线程将启动以执行任何排队任务 。
//Read Java docs for details about construcutor...
ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(10, 100, 60, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(20));
Runnable runnable = new Runnable() {
@Override
public void run() {
//Do your task...
}
};
executeTasks(poolExecutor, runnable, false, false); //Compute last 2 parameters as you need and pass on required values.
public static void executeTasks(ThreadPoolExecutor poolExecutor, Runnable runnable, boolean isUnderLoad, boolean isOverLoad){
if(isOverLoad && isUnderLoad){
//Handle this situation, this should not be allowed, probably a coding bug can result this...
}
poolExecutor.submit(runnable);
if(isUnderLoad){
poolExecutor.setCorePoolSize(5);
}
if(isOverLoad){
poolExecutor.setCorePoolSize(20);
}
}
ThreadPoolExecutor动态增加和缩小线程数。 确保正确设置池大小。 CorePoolSize定义生成的最大线程数。 当BlockingQueue定义为有限大小时,MaxPoolSize可以播放。 当您具有有限的队列大小时,会为每个提交的新任务生成新线程,直到达到核心池大小。 如果队列中的请求数增加超过队列的有限大小,则会生成新线程,直到它们到达MaxPoolSize。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.