2016-04-20 8 views
6

ho questo:Come setRemoveOnCancelPolicy per Executors.newScheduledThreadPool (5)

ScheduledExecutorService scheduledThreadPool = Executors 
     .newScheduledThreadPool(5); 

Poi ho avviare un'attività in questo modo:

scheduledThreadPool.scheduleAtFixedRate(runnable, 0, seconds, TimeUnit.SECONDS); 

conservo il riferimento al futuro in questo modo:

ScheduledFuture<?> scheduledFuture = scheduledThreadPool.scheduleAtFixedRate(runnable, 0, seconds, TimeUnit.SECONDS); 

voglio essere in grado di annullare e rimuovere t egli futuro

scheduledFuture.cancel(true); 

Tuttavia questo SO rispondere note che l'annullamento non rimuoverla e l'aggiunta di nuovi compiti si concluderà in molte attività che non possono essere GCed.

https://stackoverflow.com/a/14423578/2576903

accennano qualcosa su setRemoveOnCancelPolicy, tuttavia questo scheduledThreadPool non hai tale metodo. Cosa faccio?

risposta

7

Questo method è dichiarato in ScheduledThreadPoolExecutor.

/** 
* Sets the policy on whether cancelled tasks should be immediately 
* removed from the work queue at time of cancellation. This value is 
* by default {@code false}. 
* 
* @param value if {@code true}, remove on cancellation, else don't 
* @see #getRemoveOnCancelPolicy 
* @since 1.7 
*/ 
public void setRemoveOnCancelPolicy(boolean value) { 
    removeOnCancel = value; 
} 

Questo esecutore viene restituito per classe Esecutori da newScheduledThreadPool e metodi simili.

public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) { 
    return new ScheduledThreadPoolExecutor(corePoolSize); 
} 

Così, in breve, si può lanciare il riferimento al servizio esecutore per chiamare il metodo

ScheduledThreadPoolExecutor ex = (ScheduledThreadPoolExecutor) Executors.newScheduledThreadPool(5); 
ex.setRemoveOnCancelPolicy(true); 

o creare new ScheduledThreadPoolExecutor da soli.

ScheduledThreadPoolExecutor ex = new ScheduledThreadPoolExecutor(5); 
ex.setRemoveOnCancelPolicy(true); 
+0

Cosa intendi per cast il riferimento del servizio esecutore? Inoltre come faccio a creare ScheduledThreadPoolExecutor da solo, cosa intendi con questo? –

+0

@ J.K. controllare l'aggiornamento – AdamSkywalker

+1

Accidenti. Sto sviluppando un'applicazione Android e questa chiamata 'setRemoveOnCancelPolicy' richiede l'API 21 e il mio progetto supporta API fino a 14. C'è un altro modo per rimuovere le attività? –