我需要在多个线程上执行许多操作。
应该允许它暂停计算并增加/减少线程数量,然后取消暂停计算。
此刻,我只能增加线程数量-Future已经产生并在队列中等待的任务将一直处理,并且根据docs线程无法减少:
public void setCorePoolSize(int corePoolSize)
设置核心线程数。这会覆盖在 构造函数。 如果新值小于当前值, 多余的现有线程将在下次空闲时被终止。 如果更大,将在需要时启动新线程以执行任何 排队的任务。
所以我的主要问题是: 如何暂停执行程序以不执行在队列中等待的任务?
类示例定义:
import java.util.concurrent.*;
public class Calc {
private int numberOfThreads;
private ThradPoolExecutor pool;
private Future fut;
public void setNumberOfThreads(int threads) {
this.numberOfThreads = threads + 1;
}
public void start() {
if(es == null){
pool = (ThreadPoolExecutor) Executors.newFixedThreadPool(numberOfThreads);
} else {
pool.setCorePoolSize(numberOfThreads);
pool.setMaximumPoolSize(numberOfThreads);
}
fut = pool.submit(() -> {
while (true) {
pool.execute(this::calculate);
}
});
}
public void suspendCalculations() {
fut.cancel(true);
}
public void continueCalculations() {
start();
}
private void calculate() {
// calculation logic, not important
}
}
基于我的示例,可以想象一下情况:
以这种方式无法减少线程-我们在队列中要处理10000个任务,因此我们需要等待队列为空时。
我想等到5个线程上的5个任务结束并且队列(10000)中的任务不会传递给线程,直到我调用continueCalculations。 这样,我可以在continueCalculations之前调用setCorePoolSize(2),因为线程由于suspendCalculations而不会处理任务