Java: Zeitlimit für Threads in einem ThreadPool festlegen

8

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:

%Vor%

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

    
sk2212 09.01.2013, 13:47
quelle

1 Antwort

3

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:

  1. Lassen Sie CountDownLatch von jedem Worker ablaufen, wenn Sie fertig sind.
  2. In der Hauptausführung Thread await mit Timeout auf dem Latch.
  3. Wenn dieser Aufruf zurückkehrt, können Sie die Anzahl der Latches überprüfen, um zu sehen, ob das Zeitlimit erreicht wurde (wenn es & gt; 0 ist).
  4. a) count = 0, alle Aufgaben in der Zeit beendet. b) wenn nicht, schließ die Futures und überprüfe ihre isDone . Sie müssen den ExecutorService nicht herunterfahren.
  5. Rufen Sie herunter, wenn Sie den Executor nicht mehr benötigen.

Hinweis: Arbeiter können in der Zwischenzeit zwischen dem Timeout und dem Aufruf ihrer IsDone () beenden.

    
Fildor 09.01.2013, 14:06
quelle

Tags und Links