2013-07-02 11 views
7

że ten kod:ScheduledExecutorService, jak zatrzymać działanie bez zatrzymywania executora?

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

po pewnym przypadku należy zatrzymać, w których stwierdzono działanie w run() sposobu SomethingDoer, który realizuje Runnable.

Jak mogę to zrobić? Nie mogę zamknąć executora, powinienem odwołać tylko okresowe zadanie. Czy mogę użyć do tego celu result.get()? A jeśli mogę, proszę powiedz mi, jak to zadziała.

Odpowiedz

12

Użyj result.cancel(). ScheduledFuture to uchwyt do Twojego zadania. Musisz anulować to zadanie i nie będzie ono już wykonywane.

Właściwie cancel(boolean mayInterruptIfRunning) jest podpis i używając go z true parametru spowoduje wątek aktualnie uruchomionego exection by zostać przerwany z wezwaniem interrupt(). Spowoduje to zgłoszenie przerwanego wyjątku, jeśli wątek oczekuje na przerwanie połączenia, np. Semaphore.acquire(). Należy pamiętać, że cancel zapewnia tylko to, że zadanie nie zostanie wykonane więcej po zatrzymaniu wykonywania.

4

Możesz użyć metody cancel() z obiektu ScheduledFuture. Po anulowaniu nie będą wykonywane żadne dalsze zadania.

Jeśli chcesz, aby aktualnie uruchomione zadanie zatrzymać, trzeba kodować metodę run więc jest wrażliwy na przerywa i przekazać true metody cancel() żądania przerwania.

Powiązane problemy