Frage

Ich bin ziemlich neu in Executer -Diensten. Ich mochte es, alles selbst zu machen, aber ich denke, es ist Zeit, diesen Diensten zu vertrauen.

Ich möchte vorbeiziehen Executer a Runnable. Der Executer wickelt das in a FutureTask und gibt es mir zurück. Jetzt nenne ich Umfrage die done() Methode. Aber ich möchte benachrichtigt werden, wenn damals done() Methode würde wahr zurückkehren.

Da ist ein get() Methode, die blockiert, bis die Runnable Hat fertig, aber dann würde ich einen zusätzlichen Thread für jeden Job brauchen, um zu sehen, wann er fertig ist.

Kann ich meinem Executer etwas extra geben? Callable Um über die Aufgabe fertig zu werden?

Was ist der richtige Weg hierher? Ich könnte einen Code zum Ende der hinzufügen run Methode, aber dann done() Könnte immer noch falsch sein ...

War es hilfreich?

Lösung

Wenn Sie eine spezifische Annahme einer java.util.concurrent.threadpoolexecutor verwenden können, können Sie seine Hook -Methoden verwenden. Afterexecute () und voranschließend ().

http://download.oracle.com/javase/6/docs/api/java/util/concurrent/threadpoolexecutor.html

Sie sind nicht so elegant wie die hörbare Future, aber es könnte sich um eine angemessene Lösung handeln, vorausgesetzt, Sie benötigen nur einen Typ eines "Hörers" für eine bestimmte Executor -Instanz.

Andere Tipps

Wenn Sie eine Aufgabe nach der anderen erledigen möchten, ist es besser, sie im selben Thread zu machen.

Executor executor =
final Runnable runnable = 
executor.execute(new Runnable() {
    public void run() {
         runnable.run();
         // do something after the run() has finished.
    }
 });

Auf diese Weise wird es alles tun, was Sie nach dem Runnable im selben Thread erledigen möchten, und Sie müssen keinen anderen Thread befragen oder verwenden.

Ich würde empfehlen, sich das anzuschauen com.google.common.util.concurrent Paket in Guave, spezifisch die ListenableFuture Geben Sie und den damit verbundenen Code ein.

Sobald die nächste Veröffentlichung (R10) aus ist, ist es einfach, eine zu erstellen ExecutorService Das kehrt zurück ListenableFutures verwenden OreExecutors.ListingDeCorator (Executorservice). Sie können Ihre derzeit auch umwickeln Runnables/Callables in a ListenableFuturetask dich selbst.

final ListenableFutureTask<?> task = new ListenableFutureTask<Object>(
    runnable, null);
executor.submit(task);
task.addListener(new Runnable() {
  public void run() {
    // do whatever
  }
}, listenerExecutor);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top