我用这行代码创建一个ThreadPoolExecutor:

private ExecutorService executor = new ThreadPoolExecutor(5, 10, 120, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(20, true));

然后,我运行了25个任务(T01至T25),因此情况是:
  • 当前正在运行的5个任务(T01至T05)
  • 队列中等待20个任务(T06至T25)

  • 当我再放置1个任务(T26)时,由于队列已满,我希望删除较旧的任务(T06)以启动(因为未达到MaxPoolSize),而将新任务(T26)放在末尾队列。

    但是在现实生活中,如果“队列”已满并且未达到MaxPoolSize,则会启动最新的任务。

    所以我有 ...
  • 当前正在运行的6个任务(T01至T05和T26)
  • 队列中等待20个任务(T06至T25)

  • ... 代替 ...
  • 当前正在运行的6个任务(T01至T06)
  • 队列中等待20个任务(T07至T26)

  • 我可以配置ThreadPoolExecutor获得预期的结果吗?
    我应该使用其他类(class)吗?

    有关信息,请参阅ThreadPoolExecutor源代码的一部分
    public void execute(Runnable command) {
        if (command == null)
            throw new NullPointerException();
        if (poolSize >= corePoolSize || !addIfUnderCorePoolSize(command)) {
            if (runState == RUNNING && workQueue.offer(command)) {
                if (runState != RUNNING || poolSize == 0)
                    ensureQueuedTaskHandled(command);
            }
            else if (!addIfUnderMaximumPoolSize(command))
                reject(command); // is shutdown or saturated
        }
    }
    
    
    private boolean addIfUnderMaximumPoolSize(Runnable firstTask) {
        Thread t = null;
        final ReentrantLock mainLock = this.mainLock;
        mainLock.lock();
        try {
            if (poolSize < maximumPoolSize && runState == RUNNING)
                t = addThread(firstTask);
        } finally {
            mainLock.unlock();
        }
        if (t == null)
            return false;
        t.start();
        return true;
    }
    

    谢谢

    最佳答案

    我将使核心大小等于最大值。这就是大多数池的使用方式,我不确定您的情况何时会带来不利影响,但是您会按顺序执行任务。

    10-08 15:11