2012-12-18 14 views
7

Ho implementato l'abbonamento nella mia app Java. Quando il nuovo abbonato ha aggiunto, l'applicazione crea nuova attività (classe che implementa Runnable per essere eseguito nel thread separato) e viene aggiunto alla ExecutorService come:Arresta un Runnable inviato a ExecutorService

public void Subscribe() 
{ 
    es_.execute(new Subscriber(this, queueName, handler)); 
} 

//... 

private ExecutorService es_; 

applicazione può registrarsi come molti abbonati come si desidera. Ora voglio implementare qualcosa come Unsubscribe in modo che ogni abbonato abbia la possibilità di interrompere il flusso dei messaggi. Qui ho bisogno di un modo per fermare una delle attività in esecuzione nel ExecutorService. Ma non so come posso farlo.

Il ExecutorService.shutdown() e le sue varianti non fanno per me: terminano tutti i compiti, voglio solo terminarne uno. Sto cercando una soluzione. Il più semplice possibile. Grazie.

risposta

8

È possibile utilizzare ExecutorService#submit invece di execute e utilizzare il tornata Future oggetto per cercare di annullare l'attività utilizzando Future#cancel

Esempio (Supponendo Subscriber è una Runnable):

Future<?> future = es_.submit(new Subscriber(this, queueName, handler)); 
... 
future.cancel(true); // true to interrupt if running 

Nota importante dai commenti:

If your task doesn't honour interrupts and it has already started, it will run to completion.

+0

Sarebbe utile se si modifica la risposta per aggiungere un semplice esempio. Posso trovare tutto nella documentazione e su google, ma le risposte non sono solo per me ma anche per gli altri. Questo può risparmiare un po '(inestimabile) tempo. – maverik

+0

Ecco qui, semplice esempio –

+0

Grazie. Questo è veramente utile. – maverik

3

Invece di utilizzare ExecutorService.execute(Runnable) provare a utilizzare Future<?> submit(Runnable). Questo metodo invierà il Runnable nel pool per l'esecuzione e restituirà un oggetto Future. In questo modo avrai riferimenti a tutti i thread degli iscritti.

Per interrompere un determinato thread, utilizzare solo futureObj.cancel(true). Ciò interromperà il thread in esecuzione, lanciando un InterruptedException. Il thread di sottoscrittore deve essere codificato in modo tale da interrompere l'elaborazione nel caso di questa eccezione (ad esempio Thread.sleep(millis) con blocco try/catch wrapper per l'intero metodo).

Si cand trovare maggiori informazioni sul API ufficiali: http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/Future.html http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html

Problemi correlati