2016-03-20 4 views
5

I ThreadPoolExecutor wie unten bin mit:java 8 ThreadPoolExecutor stuck nach N Aufgaben mit return-Anweisung

ThreadPoolExecutor pool = new ThreadPoolExecutor(cores, 50, 30L, 
TimeUnit.SECONDS, new ArrayBlockingQueue<>(10)); 

und:

pool.execute(()->{ 

//code goes here 

if(some condition){ 
    return; 
} 
//code goes here 
}) 

Und wenn dieser Block mit return-Anweisung aktiviert ist, alle diese Aufgaben bekommen in TPE stecken. TPE sagt, dass es voll geladen ist und wirft immer RejectedExecutionException Ausnahme

Ich kann nicht verstehen, warum es passiert. Wenn Sie zum Beispiel einen Pool der Größe 10 haben und 100 Aufgaben haben, werden 10 davon übereinstimmen, wenn Sie die 101. Aufgabe nicht annehmen, alle nächsten Aufgaben werden abgelehnt. Warum?

+0

Es ist ziemlich schwer zu sagen, was mit dieser Beschreibung schief gelaufen ist ... wurde eine der übertragenen Aufgaben ausgeführt? vielleicht gibt es eine Art von Bug in Ihrem Aufgabencode und sie sind einfach angehalten ... – nukie

+0

Tatsächlich werden Sie 11. Aufgabe nicht annehmen, da die Warteschlange von Größe 10 ist – Antoniossss

Antwort

5

Sie nicht richtig Ihre ThreadPoolExecutor

public ThreadPoolExecutor(int corePoolSize, 
          int maximumPoolSize, 
          long keepAliveTime, 
          TimeUnit unit, 
          BlockingQueue<Runnable> workQueue) 

Erstellt ein neues ThreadPoolExecutor mit den gegebenen Anfangsparameter und Standard-Thread Fabrik konfigurieren und die Ausführung Handler zurückgewiesen. Es ist möglicherweise bequemer, eine der Executors Factory-Methoden anstelle dieses allgemeinen Konstruktors zu verwenden.

Parameter:

corePoolSize - die Anzahl der Threads im Pool zu halten, auch wenn sie frei sind, es sei denn, allowCoreThreadTimeOut

maximumPoolSize gesetzt ist - die maximale Anzahl der Threads im Pool ermöglichen

keepAliveTime - Wenn die Anzahl der Threads größer als der Kern ist, ist dies die maximale Zeit, die überschüssige inaktive Threads auf neue Aufgaben warten, bevor sie beendet werden.

unit - die Zeiteinheit für das Argument Keepalivetime

workQueue - die Warteschlange zum Halten von Aufgaben zu verwenden, bevor sie ausgeführt werden. Diese Warteschlange enthält nur die ausführbaren Aufgaben, die von der execute-Methode übergeben werden.

Ich habe noch nie TPE mit workQueue Größe (10) weniger als maximumPoolSize (50) gesehen. Mit der aktuellen Konfiguration wird der 11. Worker-Task aufgrund der Warteschlangengröße 10 (Warteschlangengröße zu diesem Zeitpunkt) zurückgewiesen.

Erhöhen Sie Ihre workQueue Größe, um RejectedExecutionException loszuwerden. 50 Threads können problemlos mehr als 1000 kleine Worker-Tasks verarbeiten. Konfigurieren Sie diese Warteschlangengröße abhängig von Ihrer Anforderung mit einem angemessenen Wert.