Frage

Ich bin mit dem Executor Rahmen auf mehrere Threads mit einem Threadpool heißt newFixedThreadPool pfeift. Ich benutze threadpool.submit (einThread) Jobs vorzulegen, die vom Threadpool ausgeführt werden, und dies funktioniert aber fein ich brauche, um zu bestimmen, wenn alle Threads abgeschlossen sind, so dass ich mit anderer Verarbeitung fortgesetzt werden kann. Ich sah Future.get bei Verwendung von (), die blockiert, bis der Faden vollständig ist das Problem hier ist, dass es blockiert, bis ein Ergebnis vorliegt. Ich sah auch kontinuierlich bei Verwendung des isTerminated () -Methode von einem Schlaf gefolgt Aufruf nach Einleitung der Shutdown Ausgabe zu überprüfen, ob alle Threads abgeschlossen sind, aber dies scheint nicht ordentlich zu mir. Gibt es eine andere Art und Weise sauberer dazu? Auch wenn es eine Ausnahme in einem der Fäden angehoben ich in der Lage sein wollen, alle anderen laufenden Threads zu beenden und auch stoppen jeder Warteschlange gestellt Thread im Pool gestartet werden kann. Was ist der beste Mechanismus, um dies zu tun?

freuen uns auf Ihre Antworten zu hören

TIA

War es hilfreich?

Lösung

Einer der sauberere Wege, dies zu nähern, indem sie die Aufgaben ändern, die vorgelegt werden. einen Rückruf mit jeder Aufgabe durch die Registrierung, kann es durch den Haupt-Thread ohne Abfrage der normalen Abschluss oder eine Ausnahme mit.

Sie können einen einfachen schreiben Wrapper, der diese für jeden Runnable tun wird.

Oder nach diesem Beispiel können Sie die Idee erweitern jede Callable zu wickeln.

class CallbackTask<T>
  implements Callable<T>
{

  private final Callable<? extends T> task;

  private final Callback<T> callback;

  CallbackTask(Callable<? extends T> task, Callback<T> callback)
  {
    this.task = task;
    this.callback = callback;
  }

  public T call()
    throws Exception
  {
    try {
      T result = task.call();
      callback.complete(result);
      return result;
    }
    catch (Exception ex) {
      callback.failed(ex);
      throw ex;
    }
  }

}

Andere Tipps

Verwenden Sie ExecutorService #shutdown () und dann ExecutorService # awaitTermination ()

Zum Beispiel:

ExecutorService service = Executors.newCachedThreadPool();
service.submit(...);
service.submit(...);
service.shutdown();
service.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);

// All tasks have now finished

Was benachrichtigt Sie, wenn eine Aufgabe mit einer Ausnahme fehlschlägt. Hier finden Sie eine Thread zur ExecutorService, die für jeden Thread es schafft einen „abgefangene Ausnahme-Handler“ setzt. Dieser Exception-Handler kann dann die laufenden Aufgaben beenden.

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