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.
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
Tatsächlich werden Sie 11. Aufgabe nicht annehmen, da die Warteschlange von Größe 10 ist – Antoniossss