Как гарантировать порядок выполнения FIFO в ThreadPoolExecutor - PullRequest
8 голосов
/ 13 декабря 2010

Я создаю 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)

Когда я ставлю еще одну задачу (T26), поскольку очередь заполнена, я ожидалчто старая задача (T06) удаляется для запуска (поскольку MaxPoolSize не достигнут), а новая задача (T26) помещается в конец очереди.

Но в реальной жизни, если очередь заполненаи MaxPoolSize не достигнут, новейшая задача запущена.

Итак, у меня есть ...

  • 6 текущих задач (T01 до T05 и T26)
  • 20 задач, ожидающих в очереди (от T06 до T25)

... вместо ...

  • 6 текущих задач (T01до T06)
  • 20 задач, ожидающих в очереди (от T07 до T26)

Можно ли настроить ThreadPoolExecutor для получения ожидаемого результата?Стоит ли использовать другие классы?

Для информации, часть исходного кода 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;
}

Спасибо

1 Ответ

6 голосов
/ 13 декабря 2010

Я бы сделал размер ядра равным максимальному.Именно так используется большинство пулов, и я не уверен, когда в вашем случае будет недостаток, но вы выполняете задачи по порядку.

...