Frage

Ich bin nicht neu in Executorservice, bin mir aber nicht sicher über meine Herangehensweise daran. Ich könnte mit bis zu 100 Threads für eine bekannte Aufgabe zu tun haben. Ich verwende das allgemeine Format unten, in dem ich eine Liste von Futuretasks erstelle und diese dann an den Executorservice übermittele. Der ExecutorService kehrt zurück und fügt diese anhängigen Ergebnisse zu einer anderen Liste hinzu. Ich itere dann über diese Liste und rufe Get () bei jedem ausstehenden Ergebnis an.

Meine Abfrage lautet: Wird dieser Block auf jeden Get () nicht bis alle 100 Threads abgeschlossen? Gibt es einen besseren Weg, dies zu tun?

Und habe ich Recht, dass Get () das Ergebnis der Call () -Methode der Callable Implementation zurückgibt? Ich verwende die Standard -Futuretask -Klasse und habe sie nicht unterklebt.

ExecutorService exec = Executors.newFixedThreadPool( NUM_THREADS );

List<JobClass> originalList = new ArrayList<JobClass>();

List<SomeOtherClass> pendingResult = new ArrayList<SomeOtherClass>();

List<Future<SomeOtherClass>> resultList = new ArrayList<Future<SomeOtherClass>>();

for( JobClass sc : originalList )
    pendingResult.add( submit( sc );

for( Future<SomeOtherClass> future : futures )
    resultList.add( future.get(5, TimeUnit.SECONDS) ); 
War es hilfreich?

Lösung

Gute Frage: Wenn ich Sie richtig verstehe, sind Sie besorgt über den Konsum des Ergebnisses erledigter Aufgaben. Ja, der Thread blockiert. Javas Antwort darauf verwendet die Fertigstellungsservice.

Wie in der Dokumentationsseite "ein Dienst, der die Produktion neuer asynchroner Aufgaben aus dem Verbrauch der Ergebnisse der abgeschlossenen Aufgaben entkodigt".

Andere Tipps

Wenn Sie nur dann fortfahren, wenn alle Aufgaben erledigt sind, können Sie das tun, was Sie vorgeschlagen haben. Es wird keine Rolle spielen, welche Bestellaufgaben erledigen. Wenn Sie jedoch so schnell wie möglich an einen anderen Prozessor weitergeben oder während der Ausführung von Aufgaben etwas anderes erledigen müssen, sollten Sie überprüfen, ob die Aufgabe zunächst abgeschlossen ist. isDone Methode zum Beispiel und rufen Sie an get() Wenn es abgeschlossen ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top