저는 ThreadPoolExecutor를 JDK6과 함께 사용하여 스레드 풀링에 대한 다양한 전략을 고민하고 있습니다. 우선 순위 큐가 작동하지만 keepAliveTime (무제한 대기열을 사용하는 경우) 이후에 풀 크기가 어떻게되지 않았는지 확실하지 않았습니다. 그래서 LinkedBlockingQueue와 CallerRuns 정책을 사용하여 ThreadPoolExecutor를보고 있습니다.왜 ThreadPoolExecutor가 keepAliveTime 후에 corePoolSize 아래의 스레드를 줄입니까?
내가 지금 가지고있는 문제는 문서가 설명해야하므로 풀이 올라가는 것입니다.하지만 작업이 완료되고 keepAliveTime이 재생되면 getPoolSize가 풀이 0으로 줄어든 것을 보여줍니다. 예제 코드는 아래 내 질문의 기초를 볼 수 있도록해야합니다
public class ThreadPoolingDemo {
private final static Logger LOGGER =
Logger.getLogger(ThreadPoolingDemo.class.getName());
public static void main(String[] args) throws Exception {
LOGGER.info("MAIN THREAD:starting");
runCallerTestPlain();
}
private static void runCallerTestPlain() throws InterruptedException {
//10 core threads,
//50 max pool size,
//100 tasks in queue,
//at max pool and full queue - caller runs task
ThreadPoolExecutor tpe = new ThreadPoolExecutor(10, 50,
5L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(100),
new ThreadPoolExecutor.CallerRunsPolicy());
//dump 5000 tasks on the queue
for (int i = 0; i < 5000; i++) {
tpe.submit(new Runnable() {
@Override
public void run() {
//just to eat some time and give a little feedback
for (int j = 0; j < 20; j++) {
LOGGER.info("First-batch Task, looping:" + j + "["
+ Thread.currentThread().getId() + "]");
}
}
}, null);
}
LOGGER.info("MAIN THREAD:!!Done queueing!!");
//check tpe statistics forever
while (true) {
LOGGER.info("Active count: " + tpe.getActiveCount() + " Pool size: "
+ tpe.getPoolSize() + " Largest Pool: " + tpe.getLargestPoolSize());
Thread.sleep(1000);
}
}
}
나는이 문제가 될 것으로 보인다 오래된 버그를 발견하지만, 그것은 닫혔다 :
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6458662. 이것은 여전히 1.6에 존재할 수 있습니까, 아니면 제가 빠진 것이 있습니까?
마치 고무로 찍힌 것 같습니다 (http://www.codinghorror.com/blog/2012/03/rubber-duck-problem-solving.html). 위의 링크 된 버그는이 문제와 관련이 있습니다. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6576792,이 문제는 1.7에서 해결 된 것으로 보입니다 (1.7을로드하고 확인 됨 - 고정 ...). 내 주요 문제는이 근본적인 버그가 거의 10 년 동안 남아 있었다는 것입니다. 이 글을 쓰려면 너무 많은 시간을 쓰고 지금은 게시하지 말고 누군가가 도움이되기를 바랍니다.
+1 멋진 발견은이 행동을 보니 놀랐습니다. –
아마도 귀하의 게시물을 질문으로 구성하고 귀하가 배운 것을 답변으로 제공하는 것이 더 좋을까요? –