Мне нужно переопределить метод выполнения исполнителя, где мне нужно изменить поведение, которое потоки больше, чем размер пула ядра будет создан только при заполнении очереди.Переопределение метода выполнения Executor
Однако в приложениях реального времени это поведение нежелательно, так как это может привести к бесконечному ожиданию задачи, присутствующей в очереди.
Я изменил метод, как показано ниже: выполнить
public void execute(Runnable command)
{
System.out.println("ActiveCount : " + getActiveCount() + " PoolSize : " + getPoolSize()
+ " QueueSize : " + getQueue().size() +" Idle Threads : " +(getPoolSize()-getActiveCount()));
int c = ctl.get();
if (workerCountOf(c) < corePoolSize) {
if (addWorker(command, true))
return;
c = ctl.get();
}
else if (isRunning(c) && workQueue.offer(command))
{
int recheck = ctl.get();
if (getActiveCount() < workerCountOf(recheck) && isRunning(recheck) && workQueue.offer(command)) {
return;
}
if (addWorker(command, false)) {
return;
}
else if (! isRunning(recheck) && remove(command))
{
reject(command);
}
else if (workerCountOf(recheck) == 0)
{
addWorker(null, false);
}
}
else
{
reject(command); // add task to the queue
}
}
Пытаюсь добиться: CoreThreads -> Non-CoreThreads -> Очередь вместо CoreThreads -> Очередь -> Non-CoreThreads.
Не является ли это поведением по умолчанию. Когда очередь заполнена, то для пула потоков создаются только новые потоки. –
Похоже, что вы используете пул потоков неправильно. –
Я чувствую, что в его случае потоки должны быть использованы для максимального размера пула, и если новый поток не может быть создан, тогда очередь должна использоваться для ожидания, когда любой поток будет свободным ... Я знаю, что это не пул по умолчанию, но в целом это обычное требование. – Batty