Я создаю 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;
}
Спасибо