ScheduledExecutorServiceでスケジュールしたタスクの停止・再開
ScheduledExecutorService#scheduleWithFixedDelay()とかscheduleAtFixedRate()でスケジュールしたタスクを停止・再開する方法。停止はScheduledFuture#cancel()で停止して、再開はscheduleし直せばいいっぽい。
正しいお作法なのかはわからんけれども、とりあえずこんな感じで意図通り動くことは確認できた。
import java.util.concurrent.*; import java.util.Date; public class TestRestartSchedule { public static void main(String[] args) { ScheduledExecutorService schedule = Executors.newScheduledThreadPool(10); MyTask task = new MyTask(); ScheduledFuture<?> sf = schedule.scheduleAtFixedRate(task, 5, 5, TimeUnit.SECONDS); try { Thread.sleep(15*1000); }catch(InterruptedException e) {} if(sf.cancel(true)) { System.out.println("canceled. sleep 15s and restart."); try { Thread.sleep(15*1000); }catch(InterruptedException e) {} sf = schedule.scheduleWithFixedDelay(task, 5, 5, TimeUnit.SECONDS); } else { System.out.println("cancel failed."); } try { Thread.sleep(15*1000); }catch(InterruptedException e) {} if(sf.cancel(true)) { System.out.println("canceled."); } else { System.out.println("cancel failed."); } } } class MyTask extends Thread { private int counter = 0; public void run() { try { Thread.sleep(1000); }catch(InterruptedException e) {} System.out.println(counter + "\t" + new Date(System.currentTimeMillis())); counter++; } }