2013-07-02 16 views
7

Ho questo codice:ScheduledExecutorService, come interrompere l'azione senza arrestare executor?

ScheduledExecutorService scheduledExecutor; 
..... 
ScheduledFuture<?> result = scheduledExecutor.scheduleWithFixedDelay(
    new SomethingDoer(),0, measurmentPeriodMillis, TimeUnit.MILLISECONDS); 

Dopo qualche evento che dovrei smettere di azione, che ha dichiarato in run() metodo della SomethingDoer, che implementa Runnable.

Come posso fare questo? Non riesco a spegnere l'esecutore, dovrei solo revocare il mio compito periodico. Posso usare result.get() per questo? E se posso, per favore dimmi come funzionerà.

risposta

12

Utilizzare result.cancel(). Il ScheduledFuture è l'handle per l'attività. È necessario annullare questa attività e non verrà più eseguita.

In realtà, cancel(boolean mayInterruptIfRunning) è la firma e utilizzarlo con true parametro farà sì che il filo di una con elaborazione in esecuzione di essere interrotto con la chiamata interrupt(). Ciò genererà un'eccezione interrotta se il thread è in attesa in una chiamata interrompibile di blocco, come Semaphore.acquire(). Tieni presente che lo standard cancel assicurerà solo che l'attività non verrà più eseguita una volta interrotta l'esecuzione.

4

È possibile utilizzare il metodo cancel() dall'oggetto ScheduledFuture. Una volta cancellato, non verranno eseguiti ulteriori compiti.

Se volete che il vostro compito attualmente in esecuzione di fermarsi, è necessario codificare il metodo run quindi è sensibile agli interrupt e passare true al metodo cancel() per richiedere un interrupt.

Problemi correlati