如何防止执行在执行者队列中等待空闲线程的任务

时间:2018-12-29 18:29:06

标签: java multithreading threadpool executorservice

我需要在多个线程上执行许多操作。

应该允许它暂停计算并增加/减少线程数量,然后取消暂停计算。

此刻,我只能增加线程数量-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
    }
}

基于我的示例,可以想象一下情况:

  1. 致电setNumberOfThreads(5)
  2. 致电start()
  3. fut将创建大队列,等待任务按随机数10000进行处理
  4. 致电suspendCalculations()
  5. 致电setNumberOfThreads(2)
  6. 致电continueCalculations()

以这种方式无法减少线程-我们在队列中要处理10000个任务,因此我们需要等待队列为空时。

我想等到5个线程上的5个任务结束并且队列(10000)中的任务不会传递给线程,直到我调用continueCalculations。 这样,我可以在continueCalculations之前调用setCorePoolSize(2),因为线程由于suspendCalculations而不会处理任务

0 个答案:

没有答案
相关问题