モジュール java.base
パッケージ java.util

クラスTimer


  • public class Timer
    extends Object
    バックグラウンド・スレッドで将来実行されるタスクをスケジュールする、スレッドのための機能です。 タスクは、1回だけ、または定期的に繰返し実行されるようにスケジュールされます。

    Timerオブジェクトと対応するのは、タイマーのタスクをすべて連続して実行するために使用される、単一のバックグラウンド・スレッドです。 タイマー・タスクは迅速に実行される必要があります。 タイマー・タスクの完了に時間がかかりすぎると、タイマーのタスク実行スレッドが占有されます。 これにより後続のタスクの実行が遅れ、違反したタスクの完了時(完了した場合)に、立て続けにまとめて実行されることになります。

    Timerオブジェクトの最後のライブ参照が終了し、かつ、未処理のタスクがすべて実行されると、タイマーのタスク実行スレッドは正常に終了し、ガベージ・コレクションの対象となります。 ただし、これには限りなく長い時間がかかる場合があります。 デフォルトでは、タスクの実行スレッドはデーモン・スレッドとしては実行されないため、アプリケーションが終了しないようにできます。 タイマーのタスク実行スレッドをただちに終了させる場合、呼出し側はタイマーのcancelメソッドを呼び出す必要があります。

    stopメソッドの呼び出しなどによりタイマーのタスク実行スレッドが予想外の時間に終了した場合、タイマーのタスクをスケジュールしようとすると、タイマーのcancelメソッドが呼び出された場合と同様に、IllegalStateExceptionが発生します。

    このクラスはスレッドセーフです。外部の同期化を行わなくても、複数のスレッドで単一のTimerオブジェクトを共有できます。

    このクラスでは、リアルタイムは保証されませんObject.wait(long)メソッドを使用して、タスクがスケジュールされます。

    Java 5.0ではjava.util.concurrentパッケージが導入されましたが、その中の並行性ユーティリティの1つがScheduledThreadPoolExecutorで、これは特定のレートまたは遅延で繰返し実行されるタスクのスレッド・プールです。 実際、これは複数のサービス・スレッドを許可し、さまざまな時間単位を受け入れ、TimerTaskのサブクラス化を必要としない(Runnableを実装するだけでよい)ため、TimerTimerTaskの組み合わせに代わる、より柔軟性の高いユーティリティです。 ScheduledThreadPoolExecutorを1つのスレッドで構成すると、Timerと同じになります。

    実装にあたっての注意:このクラスは、並行してスケジュールされた多数のタスクをスケーリングします(数千でも問題はない)。 タスク・キューを表すためにバイナリ・ヒープが内部的に使用されるため、タスクをスケジュールするコストはO(log n)になります。nは、並行してスケジュールされたタスクの数です。

    実装にあたっての注意: すべてのコンストラクタはタイマー・スレッドを開始します。

    導入されたバージョン:
    1.3
    関連項目:
    TimerTask, Object.wait(long)
    • コンストラクタのサマリー

      コンストラクタ 
      コンストラクタ 説明
      Timer()
      新しいタイマーを作成します。
      Timer​(boolean isDaemon)
      デーモンとして実行されるように指定できる関連スレッドを持つ、新しいタイマーを作成します。
      Timer​(String name)
      指定された名前の関連するスレッドを持つ新しいタイマーが作成されます。
      Timer​(String name, boolean isDaemon)
      デーモンとして実行されるように指定できる、指定された名前の関連するスレッドを持つ、新しいタイマーを作成します。
    • メソッドのサマリー

      すべてのメソッド インスタンス・メソッド 具象メソッド 
      修飾子と型 メソッド 説明
      void cancel()
      現在スケジュールされているタスクを破棄して、このタイマーを終了します。
      int purge()
      取り消されたすべてのタスクを、このタイマーのタスク・キューから削除します。
      void schedule​(TimerTask task, long delay)
      指定した遅延のあとに、指定したタスクが実行されるようスケジュールします。
      void schedule​(TimerTask task, long delay, long period)
      指定したタスクが、指定した遅延のあとに開始され、固定遅延実行を繰り返すようにスケジュールします。
      void schedule​(TimerTask task, Date time)
      指定した時間に指定したタスクが実行されるようスケジュールします。
      void schedule​(TimerTask task, Date firstTime, long period)
      指定したタスクが、指定した時間に開始され、固定遅延実行を繰り返すようにスケジュールします。
      void scheduleAtFixedRate​(TimerTask task, long delay, long period)
      指定したタスクが、指定した遅延のあとに開始され、固定頻度実行を繰り返すようにスケジュールします。
      void scheduleAtFixedRate​(TimerTask task, Date firstTime, long period)
      指定したタスクが、指定した時間に開始され、固定頻度実行を繰り返すようにスケジュールします。
    • コンストラクタの詳細

      • Timer

        public Timer()
        新しいタイマーを作成します。 関連するスレッドは、デーモンとして実行されません
      • Timer

        public Timer​(boolean isDaemon)
        デーモンとして実行されるように指定できる関連スレッドを持つ、新しいタイマーを作成します。 デーモン・スレッドは、タイマーが保守作業の繰返しをスケジュールするために使用される場合に呼び出されます。これは、アプリケーションが実行されている間実行される必要がありますが、アプリケーションの寿命を引き延ばすことはできません。
        パラメータ:
        isDaemon - 関連するスレッドがデーモンとして実行される場合はtrue。
      • Timer

        public Timer​(String name)
        指定された名前の関連するスレッドを持つ新しいタイマーが作成されます。 関連するスレッドは、デーモンとして実行されません
        パラメータ:
        name - 関連するスレッドの名前
        例外:
        NullPointerException - nameがnullである場合
        導入されたバージョン:
        1.5
      • Timer

        public Timer​(String name,
                     boolean isDaemon)
        デーモンとして実行されるように指定できる、指定された名前の関連するスレッドを持つ、新しいタイマーを作成します。
        パラメータ:
        name - 関連するスレッドの名前
        isDaemon - 関連するスレッドがデーモンとして実行される場合はtrue
        例外:
        NullPointerException - nameがnullである場合
        導入されたバージョン:
        1.5
    • メソッドの詳細

      • schedule

        public void schedule​(TimerTask task,
                             long delay)
        指定した遅延のあとに、指定したタスクが実行されるようスケジュールします。
        パラメータ:
        task - スケジュールされるタスク。
        delay - タスクが実行される前のミリ秒単位の遅延。
        例外:
        IllegalArgumentException - delayが負の値の場合、またはdelay+System.currentTimeMillis()が負の値の場合。
        IllegalStateException - タスクがすでにスケジュールされたか取り消された場合、タイマーが取り消された場合、またはタイマー・スレッドが終了した場合
        NullPointerException - taskがnullである場合
      • schedule

        public void schedule​(TimerTask task,
                             Date time)
        指定した時間に指定したタスクが実行されるようスケジュールします。 過去の時間を指定すると、タスクはただちに実行されるようスケジュールされます。
        パラメータ:
        task - スケジュールされるタスク。
        time - タスクが実行される時間。
        例外:
        IllegalArgumentException - time.getTime()が負の値の場合。
        IllegalStateException - タスクがすでにスケジュールされたか取り消された場合、タイマーが取り消された場合、またはタイマー・スレッドが終了した場合
        NullPointerException - taskまたはtimeがnullである場合
      • schedule

        public void schedule​(TimerTask task,
                             long delay,
                             long period)
        指定したタスクが、指定した遅延のあとに開始され、固定遅延実行を繰り返すようにスケジュールします。 そのあとは、指定した期間とは別に、ほぼ一定の間隔で実行されます。

        固定遅延実行では、前の実行の実際の実行時間を基準にしてそれぞれの実行がスケジュールされます。 何らかの理由で実行が遅延した場合(ガベージ・コレクション、その他のバックグラウンド作業など)、そのあとの実行も遅延されます。 最終的に、実行の頻度は通常、指定した期間の対応する頻度よりも若干遅くなります(Object.wait(long)のベースにあるシステム・クロックが正確であることが前提)。

        固定遅延実行は、円滑さを必要とする作業の繰返しに適しています。 つまり、長時間の実行よりも短時間の実行で頻度の正確さを維持する必要のある作業に適しています。 これには、一定の間隔でカーソルを点滅させるなど、ほとんどのアニメーション・タスクが含まれます。 また、キーが押されている間は文字を自動的に繰り返すなど、ユーザーの入力に応じて一定の活動が実行されるタスクも含まれます。

        パラメータ:
        task - スケジュールされるタスク。
        delay - タスクが実行される前のミリ秒単位の遅延。
        period - 連続するタスクが実行されるミリ秒単位の間隔。
        例外:
        IllegalArgumentException - delay < 0delay+System.currentTimeMillis()< 0、またはperiod <= 0の場合
        IllegalStateException - タスクがすでにスケジュールされたか取り消された場合、タイマーが取り消された場合、またはタイマー・スレッドが終了した場合
        NullPointerException - taskがnullである場合
      • schedule

        public void schedule​(TimerTask task,
                             Date firstTime,
                             long period)
        指定したタスクが、指定した時間に開始され、固定遅延実行を繰り返すようにスケジュールします。 そのあとは、指定した期間とは別に、ほぼ一定の間隔で実行されます。

        固定遅延実行では、前の実行の実際の実行時間を基準にしてそれぞれの実行がスケジュールされます。 何らかの理由で実行が遅延した場合(ガベージ・コレクション、その他のバックグラウンド作業など)、そのあとの実行も遅延されます。 最終的に、実行の頻度は通常、指定した期間の対応する頻度よりも若干遅くなります(Object.wait(long)のベースにあるシステム・クロックが正確であることが前提)。 上記の結果として、スケジュールされる最初の時間が過去の時間である場合、ただちに実行されるようスケジュールされます。

        固定遅延実行は、円滑さを必要とする作業の繰返しに適しています。 つまり、長時間の実行よりも短時間の実行で頻度の正確さを維持する必要のある作業に適しています。 これには、一定の間隔でカーソルを点滅させるなど、ほとんどのアニメーション・タスクが含まれます。 また、キーが押されている間は文字を自動的に繰り返すなど、ユーザーの入力に応じて一定の活動が実行されるタスクも含まれます。

        パラメータ:
        task - スケジュールされるタスク。
        firstTime - タスクが実行される最初の時間
        period - 連続するタスクが実行されるミリ秒単位の間隔。
        例外:
        IllegalArgumentException - firstTime.getTime()< 0またはperiod <= 0の場合
        IllegalStateException - タスクがすでにスケジュールされたか取り消された場合、タイマーが取り消された場合、またはタイマー・スレッドが終了した場合
        NullPointerException - taskまたはfirstTimeがnullである場合
      • scheduleAtFixedRate

        public void scheduleAtFixedRate​(TimerTask task,
                                        long delay,
                                        long period)
        指定したタスクが、指定した遅延のあとに開始され、固定頻度実行を繰り返すようにスケジュールします。 そのあとは、指定した期間とは別に、ほぼ一定の間隔で実行されます。

        固定頻度実行では、最初の実行のスケジュールされた実行時間を基準にしてそれぞれの実行がスケジュールされます。 何らかの理由で実行が遅延した場合(ガベージ・コレクションまたはその他のバックグラウンド作業など)、遅れを取り戻すために2つ以上の実行が連続して行われます。 最終的に、実行の頻度は指定した期間の対応する頻度と同じになります(Object.wait(long)のベースにあるシステム・クロックが正確であることが前提)。

        固定頻度実行は、1時間ごとにチャイムを鳴らしたり、特定の時間に毎日スケジュールされた保守を実行するなど、絶対時間を反映する作業を繰り返すのに適しています。 また、10秒ごとに刻まれるカウントダウン・タイマーなど、決まった数の実行の合計時間が重要な作業を繰り返すのにも適しています。 さらに、固定頻度実行は、相互に同期化を保持する必要がある複数の繰返しタイマー・タスクをスケジュールするのにも適しています。

        パラメータ:
        task - スケジュールされるタスク。
        delay - タスクが実行される前のミリ秒単位の遅延。
        period - 連続するタスクが実行されるミリ秒単位の間隔。
        例外:
        IllegalArgumentException - delay < 0delay+System.currentTimeMillis()< 0、またはperiod <= 0の場合
        IllegalStateException - タスクがすでにスケジュールされたか取り消された場合、タイマーが取り消された場合、またはタイマー・スレッドが終了した場合
        NullPointerException - taskがnullである場合
      • scheduleAtFixedRate

        public void scheduleAtFixedRate​(TimerTask task,
                                        Date firstTime,
                                        long period)
        指定したタスクが、指定した時間に開始され、固定頻度実行を繰り返すようにスケジュールします。 そのあとは、指定した期間とは別に、ほぼ一定の間隔で実行されます。

        固定頻度実行では、最初の実行のスケジュールされた実行時間を基準にしてそれぞれの実行がスケジュールされます。 何らかの理由で実行が遅延した場合(ガベージ・コレクションまたはその他のバックグラウンド作業など)、遅れを取り戻すために2つ以上の実行が連続して行われます。 最終的に、実行の頻度は指定した期間の対応する頻度と同じになります(Object.wait(long)のベースにあるシステム・クロックが正確であることが前提)。 上記の結果として、スケジュールされる最初の時間が過去の時間である場合、実行が間に合わなかったものがあればすべて遅れを取り戻すためにただちに実行されるようスケジュールされます。

        固定頻度実行は、1時間ごとにチャイムを鳴らしたり、特定の時間に毎日スケジュールされた保守を実行するなど、絶対時間を反映する作業を繰り返すのに適しています。 また、10秒ごとに刻まれるカウントダウン・タイマーなど、決まった数の実行の合計時間が重要な作業を繰り返すのにも適しています。 さらに、固定頻度実行は、相互に同期化を保持する必要がある複数の繰返しタイマー・タスクをスケジュールするのにも適しています。

        パラメータ:
        task - スケジュールされるタスク。
        firstTime - タスクが実行される最初の時間
        period - 連続するタスクが実行されるミリ秒単位の間隔。
        例外:
        IllegalArgumentException - firstTime.getTime()< 0またはperiod <= 0の場合
        IllegalStateException - タスクがすでにスケジュールされたか取り消された場合、タイマーが取り消された場合、またはタイマー・スレッドが終了した場合
        NullPointerException - taskまたはfirstTimeがnullである場合
      • cancel

        public void cancel()
        現在スケジュールされているタスクを破棄して、このタイマーを終了します。 現在実行中のタスク(ある場合)には干渉しません。 タイマーが終了すると、実行スレッドも同時に終了し、タスクはスケジュールされなくなります。

        このタイマーによって呼び出されたタイマー・タスクの実行メソッドからこのメソッドを呼び出すと、進行中のタスク実行は、このタイマーで実行される最後のタスク実行になります。

        このメソッドは、繰返し呼び出されます。2回目以降の呼出しには、効果はありません。

      • purge

        public int purge()
        取り消されたすべてのタスクを、このタイマーのタスク・キューから削除します。 このメソッドを呼び出してもタイマーの動作は影響を受けませんが、取り消されたタスクへの参照をキューから排除します。 これらのタスクへの外部参照が存在しない場合、タスクはガベージ・コレクションの対象となります。

        大半のプログラムは、このメソッドを呼び出す必要はありません。 これは、多数のタスクを取り消す、まれなアプリケーション用として設計されています。 このメソッドを呼び出すと、処理時間よりメモリー効率が優先されるため、メソッドの実行時間がn + c log nに比例する場合があります。ここで、nはキュー内のタスクの数、cは取り消されたタスクの数を表します。

        このメソッドは、このタイマーでスケジュールされたタスク内から呼び出すことができます。

        戻り値:
        キューから削除されたタスクの数
        導入されたバージョン:
        1.5