2012-04-10 11 views
1

Ich erstelle einen Threadpool und da ich keine Ausgabe von meinen Threads brauche, verwende ich keine Futures & Callables. Aber das Problem ist, dass, wenn ich keine Futures verwende, ich sehe, dass Threadpool Aufgaben verliert, die ich einreiche.seltsam Java threadpool Verhalten - verlieren Aufgaben, wenn Futures verwendet werden

Hier ist mein Code-Struktur, die Aufgaben- verliert

while(hasWorkToDo){ 
ThreadPoolExecutor.execute(new Worker()); 
System.out.println("Work submitted"); 
} 

Innerhalb Worker() Ich drucke „bekam Arbeit“ in der ersten Zeile von run() Umsetzung.

Wenn ich oben Code ausführen, ist die Anzahl der "bekam Arbeit" immer weniger als "Arbeit eingereicht".

Aber, wenn ich meine Code-Struktur ändern

ArrayList<Future<String>> list = new ArrayList<Future<String>>(); 
while(hasWorkToDo){ 
Future<String> submit=ThreadPoolExecutor.submit(new Worker()); 
list.add(submit) 
} 

for (Future<String> f : list) { 
f.get(); 
} 

ich dann sehen, dass die Anzahl der Male, „bekam Arbeit“ unten- gleich

„Arbeit eingereicht“

Dies führt mich zu glauben, dass Wenn ich nicht Futures & Callables verwende, verwendet der Threadpool die von mir gesendeten Aufgaben.

Haben Sie schon einmal ein solches Verhalten gesehen? Gibt es eine bessere Möglichkeit, dies zu debuggen?

Antwort

0

Sie müssen die Future-Tasks nicht warten, Sie müssen weniger warten, bis sie abgeschlossen sind, bevor Sie den Executor herunterfahren. Ich vermute, Sie verwenden shutdownNow() irgendwo. Verwenden Sie stattdessen shutdown().

+1

Ich hatte shutdown() an falscher Stelle – user837208

0

Eine ThreadPoolExecutor kann Aufgaben ablehnen, wenn sie heruntergefahren wird oder wenn sie ihre Kapazität erreicht hat. Sie können setRejectedExectutionHandler verwenden, um zu testen, ob Aufgaben zurückgewiesen werden.

Verwandte Themen