2009-10-05 3 views
16

Die Anzahl der eingereichten Aufgaben (Threads) ist in diesem Testszenario ebenfalls nicht groß.Warum wirft Executors.newCachedThreadPool java.util.concurrent.RejectedExecutionException beim Senden aus

+2

Könnten Sie bitte Ihre Frage verfeinern? Z.B. Fügen Sie einen kurzen Testfall hinzu. – Kutzi

+0

Entschuldigung, es gibt nicht viel Code, den ich aus IP-Gründen teilen kann. In Nussschale rufe ich mit Callable Typen ein. Ich suche nach möglichen Szenarien, dass dies passieren kann. –

+1

Willst du sagen, dass es kein bestimmtes Szenario gibt, das du dir ansiehst, sondern stattdessen von den hypothetischen Szenarien wissen möchtest, in denen diese Ausnahme ausgelöst werden könnte? Wenn ja, sollten Sie die Frage von "Warum ..." auf "Wann ..." umformulieren. – akf

Antwort

30

Sie werden Code-Beispiele, wie Sie instanziiert zur Verfügung stellen müssen und submit auf den Pool nennen (IP hier kein Thema sein sollte, da wir wie der Interna Ihrer Callable Klassen oder irgendetwas nicht Details brauchen Das).

Basierend auf den Informationen, die Sie angegeben haben, schließen Sie den Executor-Service mit ziemlicher Sicherheit, bevor Sie ihn absetzen. Überprüfen Sie, ob Sie Anrufe an shutdown oder shutdownNow tätigen, und wenn ja, stellen Sie sicher, dass Sie nach diesem Punkt keine Aufgaben hinzufügen.

Darüber hinaus möchten Sie vielleicht Ihre eigene Implementierung von java.util.concurrent.RejectedExecutionHandler registrieren, um beim Debuggen zu helfen; Seine Nachricht rejectedExecution wird immer dann aufgerufen, wenn der Executor eine Aufgabe nicht annehmen kann. Sie können also eine rudimentäre State-Inspection-Logik verwenden, um die Ursache zu finden.

+0

Sie hatten Recht; Ich habe den Code gefunden, der den Executor-Pool heruntergefahren hat; Vielen Dank –

25

Ich sehe nirgendwo im Aufruf der Executors.newCachedThreadPool() Methoden, wo ein RejectedExecutionException geworfen wird. Es gibt nur drei Fälle, in denen es in Java 6 geworfen zu sein scheint:

  • wenn execute() auf einem ThreadPoolExecutor und die maximale Poolgröße Aufruf erreicht wurde.
  • beim Aufruf execute() auf einer ThreadPoolExecutor zur gleichen Zeit, die shutdownNow, und hat im Wesentlichen das Rennen mit dem shutdownNow Anruf verloren.
  • bei dem Versuch, die Ausführung eines Runnable in einem ScheduledThreadPoolExecutor nach dem Herunterfahren des Executor geplant zu planen.
+4

+1 für die Auflistung aller möglichen Fälle –

Verwandte Themen