ExecutorService.shutdownNow () beendet Threads nicht

8

Ich betreibe ein hochgradig paralleles Java-Programm. Während viele Threads Tasks an einen Executor-Service senden, ruft der Hauptthread zu einem bestimmten Zeitpunkt ExecutorService.shutdownNow() auf.

Nach dieser Aktion würde ich Folgendes erwarten:

  1. Es wurde keine zusätzliche Aufgabe vom Executor-Service akzeptiert
  2. Die Warteschlange des Executor-Service ist leer
  3. Die verbleibenden aktiven Worker werden unterbrochen, dh an einem bestimmten Punkt werden sie heruntergefahren, wenn sie die InterruptedException korrekt verwalten und / oder Thread.currentThread().isInterrupted() explizit überprüfen.

Da ich in einer Situation bin, wo:

  1. Der Executor-Service wird aufgrund eines ExecutorService.shutdownNow() "heruntergefahren", aber nicht heruntergefahren, dh ExecutorService.awaitTermination(long, TimeUnit) gibt niemals true zurück
  2. Es gibt einige ausstehende Threads, die von meinem Executor-Service verwaltet werden und auf einem BlockingQueue.take() warten.
  3. Wenn ich ExecutorService.shutdownNow() erneut aufrufe, sterben die ausstehenden Threads um InterruptedException auf BlockingQueue.take()

Ich nehme an, dass die Unterbrechung von diesen Threads vor dem Aufruf von BlockingQueue.take() empfangen wurde und die InterruptedException ignoriert wurde.

Ich habe mich auch gefragt, ob das ExecutorService.shutdownNow() Thread-sicher ist, das heißt, es funktioniert auch dann richtig, wenn der Thread-Pool viele Eingaben erhält.

Alles in allem hätte ich zwei Fragen:

  1. Gibt es ein alternatives Szenario, das meine Situation erklären würde?
  2. Ist es möglich, dass ExecutorService.shutdownNow() nicht threadsicher ist?
Mirko 20.06.2014, 12:50
quelle

1 Antwort

3
  

Gibt es ein alternatives Szenario, das meine Situation erklären würde?

In Ihrem Thread-Code muss etwas sein, das das unterbrochene Flag zurücksetzt oder ein InterruptedException , das von einem anderen Methodenaufruf ausgelöst wurde, verschluckt.

Wenn das unterbrochene Flag gesetzt wird, bevor die Ausführung die Methode BlockingQueue.take() erreicht, wirft diese Methode immer noch InterruptedException und bricht ab. Dies wird im folgenden Code demonstriert, der sofort beendet und "Unterbrochen!" Ausgibt:

%Vor%
  

Ist es möglich, dass ExecutorService.shutdownNow () nicht threadsicher ist?

Siehe zum Beispiel: Ist ThreadPoolExecutor Thread sicher? . Laut dieser Antwort sind alle Standardimplementierungen von ExecutorService threadsicher (auch wenn die Javadocs für dieses Thema nicht explizit sind).

    
Duncan Jones 20.06.2014 13:03
quelle