Javaで毎分、0秒になったら処理を行う


Javaで毎分、0秒になったら処理を行いたいのですがどうすればいいのでしょうか?

下の例のように`while`を使う方法もありますが、getInstanceを何度も呼び出しているので、あまりいい方法ではないように思います。

Timerやscheduleを見ても、指定した秒数後に処理を実行することはできるようですが、指定秒になったら実行するようなものはありませんでした。

何か他にいい方法はあるのでしょうか?

[code]

    
    Calendar cal;
    while (true) {
        cal = Calendar.getInstance();
        if (cal.get(Calendar.SECOND) == 0) { // もし、calの秒が0秒なら
            // do something...
        }
    }
    
    
[/code]




Javaの標準機能であれば、`ScheduledExecutorService`というクラスがあります。  
このクラスを利用して下記のようなコードとした場合、60秒ごとにRunnableを継承したクラスの処理を実行することができます。

[code]

    ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
    scheduler.scheduleAtFixedRate(Runnableを継承したクラス, 0, 60, TimeUnit.SECONDS);
    
[/code]

**2015/10/27追記**  
`ScheduledExecutorService`クラスを利用して指定秒に実行する方法ですが、  
例えば下記のコードのように、処理を繰り返すためのサービスと、繰り返し処理を起動ためのサービスの２つを定義し、繰り返し処理起動後に起動サービスを停止してしまえば、あとは指定秒に実行されるようになります。

[code]

    // 繰り返し処理用のサービス
    final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
    // 繰り返し処理起動用のサービス
    final ScheduledExecutorService startScheduler = Executors.newScheduledThreadPool(1);
    // 繰り返し処理の内容
    final Runnable runner = () -> System.out.println(new Date());
    // 繰り返し処理の起動を行うためのRunnable
    final Runnable starter = () -> {
        final Calendar cal = Calendar.getInstance();
        if (0 == cal.get(Calendar.SECOND)) {
            scheduler.scheduleAtFixedRate(runner, 0, 60, TimeUnit.SECONDS);
            // 繰り返し処理が開始されたら起動サービスは停止
            startScheduler.shutdown();
        }
    };
    // 起動サービスをスタート
    startScheduler.scheduleAtFixedRate(starter, 0, 1, TimeUnit.SECONDS);
    
[/code]

このようにすることで、初回起動までは`Calendar.getInstance()`が複数回呼ばれてしまいますが、一度繰り返し処理起動した後は`Calendar.getInstance()`は呼ばれなくなります。




Javaの標準機能であれば、`ScheduledExecutorService`というクラスがあります。  
このクラスを利用して下記のようなコードとした場合、60秒ごとにRunnableを継承したクラスの処理を実行することができます。

[code]

    ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
    scheduler.scheduleAtFixedRate(Runnableを継承したクラス, 0, 60, TimeUnit.SECONDS);
    
[/code]

**2015/10/27追記**  
`ScheduledExecutorService`クラスを利用して指定秒に実行する方法ですが、  
例えば下記のコードのように、処理を繰り返すためのサービスと、繰り返し処理を起動ためのサービスの２つを定義し、繰り返し処理起動後に起動サービスを停止してしまえば、あとは指定秒に実行されるようになります。

[code]

    // 繰り返し処理用のサービス
    final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
    // 繰り返し処理起動用のサービス
    final ScheduledExecutorService startScheduler = Executors.newScheduledThreadPool(1);
    // 繰り返し処理の内容
    final Runnable runner = () -> System.out.println(new Date());
    // 繰り返し処理の起動を行うためのRunnable
    final Runnable starter = () -> {
        final Calendar cal = Calendar.getInstance();
        if (0 == cal.get(Calendar.SECOND)) {
            scheduler.scheduleAtFixedRate(runner, 0, 60, TimeUnit.SECONDS);
            // 繰り返し処理が開始されたら起動サービスは停止
            startScheduler.shutdown();
        }
    };
    // 起動サービスをスタート
    startScheduler.scheduleAtFixedRate(starter, 0, 1, TimeUnit.SECONDS);
    
[/code]

このようにすることで、初回起動までは`Calendar.getInstance()`が複数回呼ばれてしまいますが、一度繰り返し処理起動した後は`Calendar.getInstance()`は呼ばれなくなります。

