Ich möchte Timeouts für Threads festlegen, die innerhalb eines Thread-Pools ausgeführt werden. Im Moment habe ich folgenden Code:
%Vor%Der Code teilt nur eine große Liste von Objekten in Unterlisten auf und verarbeitet diese Unterliste innerhalb einzelner Threads. Aber das ist nicht der Punkt.
Ich möchte jedem einzelnen Thread im Thread-Pool ein Timeout geben. Für nur einen Thread im Pool habe ich folgende Lösung gefunden:
%Vor% Aber das würde nicht für mehr als einen Thread funktionieren. Vielleicht muss ich jeden Thread in eine List<Future>
-Liste setzen und über diese Liste iterieren und ein Timeout für jedes future
-Objekt setzen?
Irgendwelche Vorschläge?
BEARBEITEN NACH VERWENDUNG von CountDownLatch:
%Vor%Funktioniert bisher gut.
Nächste Frage ist also, wie man einen Thread unterbricht, dessen Timeout abgelaufen ist? Ich probiere fut.cancel(true)
und füge folgendes Konstrukt in einigen kritischen Schleifen im Worker-Thread hinzu:
Der Worker-Thread wird also nach dem Timeout "beendet". Ist das eine gute Lösung?
Außerdem: Ist es möglich, den Namen des Threads zu erhalten, dessen Timeout über die Future
Schnittstelle abgelaufen ist? Im Moment muss ich den Namen in der if-Bedingung des Thread.interrupted()
-Konstruktes ausdrucken.
Danke für Ihre Hilfe!
Grüße
Hast du das gesehen? ExecutorService.invokeAll
Es sollte genau das sein, was Sie wollen: Rufen Sie ein Bündel von Arbeitern auf und lassen Sie sie ablaufen, wenn Sie zu lange brauchen.
EDIT nach Kommentar - (neue Idee):
Sie können eine CountDownLatch verwenden, um auf die Ausführung der Aufgaben zu warten UND Timeout über await(long timeout, TimeUnit unit)
!
Sie können dann sogar eine shutdownNow durchführen und sehen, welche Aufgaben zu lange gedauert haben ...
EDIT 2:
Um es klarer zu machen:
await
mit Timeout auf dem Latch. isDone
. Sie müssen den ExecutorService nicht herunterfahren. Hinweis: Arbeiter können in der Zwischenzeit zwischen dem Timeout und dem Aufruf ihrer IsDone () beenden.
Tags und Links java multithreading timeout