Domanda

Sono abbastanza nuovo ai servizi esecutivi. Mi è piaciuto fare tutto da solo, ma penso che sia tempo di fidarsi di questi servizi.

Voglio consegnare Executer un Runnable. L'esecutivo lo avvolge in a FutureTask E me lo restituisce. Ora chiamo sondaggio il done() metodo. Ma vorrei essere avvisato quando allora done() Il metodo restituirebbe vero.

C'è un get() metodo che blocca fino al Runnable ha finito, ma poi avrei bisogno di un thread extra per ogni lavoro, solo per vedere quando è finito.

Posso consegnare un po 'di exexe in più Callable per essere notificato al compito che finisce?

Qual è il modo per andare qui? Potrei aggiungere un po 'di codice alla fine del run metodo, ma poi done() Potrebbe essere ancora falso ...

È stato utile?

Soluzione

Se è possibile presentare specifiche di utilizzare un java.util.concurrent.ThreadPolexecutor, è possibile utilizzare i suoi metodi hook; aftexecute () e prima esecuto ().

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

Non sono eleganti come il Future ascoltabile, ma potrebbe essere una soluzione adeguata a condizione che tu sia necessario solo un tipo di "ascoltatore" per una determinata istanza dell'esecutore.

Altri suggerimenti

Se vuoi fare un'attività dopo l'altra, è meglio farlo nello stesso thread.

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

In questo modo farà quello che vuoi fare dopo il runnable nello stesso thread e non è necessario sondaggio o utilizzare un altro thread.

Consiglierei di dare un'occhiata al com.google.common.util.ConCurrent pacchetto in Guaiava, in particolare il LOODABLEFUTURE Digita e il codice ad esso correlato.

Una volta uscita la prossima versione (R10), sarà facile creare un ExecutorService che ritorna ListenableFutures usando MoreExecutors.LisingDecorator (Executorservice). Attualmente puoi anche avvolgere il tuo RunnableS/Callables in a ListenutibleFutureTask te stesso.

final ListenableFutureTask<?> task = new ListenableFutureTask<Object>(
    runnable, null);
executor.submit(task);
task.addListener(new Runnable() {
  public void run() {
    // do whatever
  }
}, listenerExecutor);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top