たまには日記の一つでも。

28にしてはじめたバイオリンの記録と、ときどき日曜ハッキング

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++;
    }
}