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.
기본 동작이 아니므로 대기열이 꽉 차면 새 스레드 만 스레드 풀에 생성됩니다. –
그러면 스레드 풀을 잘못 사용하고있는 것 같습니다. –
나는 그의 경우 스레드가 최대 풀 크기로 활용 될 필요가 있다고 느낀다. 새로운 스레드를 만들 수 없다면 모든 스레드가 자유롭게 될 때까지 대기해야한다. 풀이 아님을 안다. 기본 동작이지만 일반적으로 일반적인 요구 사항입니다. – Batty