2013-10-10 2 views
1

Мне нужно переопределить метод выполнения исполнителя, где мне нужно изменить поведение, которое потоки больше, чем размер пула ядра будет создан только при заполнении очереди.Переопределение метода выполнения 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.

+0

Не является ли это поведением по умолчанию. Когда очередь заполнена, то для пула потоков создаются только новые потоки. –

+1

Похоже, что вы используете пул потоков неправильно. –

+0

Я чувствую, что в его случае потоки должны быть использованы для максимального размера пула, и если новый поток не может быть создан, тогда очередь должна использоваться для ожидания, когда любой поток будет свободным ... Я знаю, что это не пул по умолчанию, но в целом это обычное требование. – Batty

ответ

1

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

У меня была такая же проблема, и вы можете по ссылке:

click to follow the thread.

Я чувствую, что это должно быть вам последний выбор, попробовать что-то другое первое.

Смежные вопросы