Mam do czynienia z różnymi strategiami łączenia wątków za pomocą ThreadPoolExecutor z JDK6. Mam kolejkę Priority działającą, ale nie byłem pewien, czy podoba mi się, że pula nie ma rozmiaru po keepAliveTime (co otrzymujesz w nieograniczonej kolejce). Tak, patrzę na ThreadPoolExecutor przy użyciu zasady LinkedBlockingQueue i CallerRuns.Dlaczego ThreadPoolExecutor redukuje wątki poniżej corePoolSize po keepAliveTime?
Problem, który mam teraz, polega na tym, że pula wzrasta, ponieważ dokumentacja wyjaśnia, że powinna, ale po zakończeniu zadań i uruchomieniu keepAliveTime, funkcja getPoolSize pokazuje, że pula zostaje zmniejszona do zera. Przykładowy kod poniżej powinny pozwolić widać podstawę do mojego pytania:
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);
}
}
}
znalazłem starą błąd, który wydaje się być to problem, ale było zamknięte: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6458662. Czy to może być nadal obecne w wersji 1.6 czy coś mi brakuje?
Wygląda na to, że I Rubber Ducked this (http://www.codinghorror.com/blog/2012/03/rubber-duck-problem-solving.html). Błąd, który podałem powyżej, jest związany z tym: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6576792, gdzie problem wydaje się być rozwiązany w 1.7 (załadowałem 1.7 i zweryfikowałem - naprawiono ...). Myślę, że moim głównym problemem było to, że błąd ten fundamentalny pozostał przez prawie dziesięć lat. Spędziłem zbyt dużo czasu, pisząc to, aby nie opublikować go teraz, mam nadzieję, że to pomoże komuś.
+1 Miłe znalezisko, byłem zaskoczony, widząc to zachowanie. –
Być może lepiej byłoby ustrukturyzować swój post jako pytanie, a następnie podać to, czego nauczyłeś się jako odpowiedź? –