2013-10-10 2 views
1

executor의 execute 메소드를 오버라이드해야하는데 큐가 가득 찬 경우에만 코어 풀 크기보다 많은 쓰레드가 생성되는 동작을 변경해야한다.Executor의 execute 메소드를 오버라이드

그러나 실시간 응용 프로그램에서이 동작은 대기열에있는 작업의 대기 시간이 끝날 수 있으므로 바람직하지 않습니다.

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 


    } 
} 

달성하려고 :

I는 다음과 같이 실행 방법 변경을 CoreThreads -> 비 CoreThreads -> 대신 CoreThreads의 큐 -> 큐 -> 비 CoreThreads.

+0

기본 동작이 아니므로 대기열이 꽉 차면 새 스레드 만 스레드 풀에 생성됩니다. –

+1

그러면 스레드 풀을 잘못 사용하고있는 것 같습니다. –

+0

나는 그의 경우 스레드가 최대 풀 크기로 활용 될 필요가 있다고 느낀다. 새로운 스레드를 만들 수 없다면 모든 스레드가 자유롭게 될 때까지 대기해야한다. 풀이 아님을 안다. 기본 동작이지만 일반적으로 일반적인 요구 사항입니다. – Batty

답변

1

실행 방법을 변경해야하는 이유를 이해하지 못한다고 생각합니다. 코드에서 볼 수 있듯이 최대 풀 크기를 대기열보다 우선해서는 안됩니다. 나는 이것이 당신에게 마지막 선택을 할 수 밖에 처음으로 뭔가를 시도해야한다고 생각

click to follow the thread.

:

나는 같은 문제가 있었다 당신은 링크를 따라 할 수 있습니다.

관련 문제