各Timer
オブジェクトに対応する単一のバックグラウンド・スレッドは、タイマーのすべてのタスクを順番に実行するために使用されます。 タイマー・タスクは迅速に実行される必要があります。 タイマー・タスクの完了に時間がかかりすぎると、タイマーのタスク実行スレッドが「占有」されます。 これにより後続のタスクの実行が遅れ、違反したタスクの完了時(完了した場合)に、立て続けに「まとめて」実行されることになります。
Timer
オブジェクトに対する最後のライブ参照がなくなり、すべての未処理タスクの実行が完了すると、タイマーのタスク実行スレッドは(ガベージ・コレクションの対象になります)を正常に終了します。 ただし、これには限りなく長い時間がかかる場合があります。 デフォルトでは、タスクの実行スレッドはデーモン・スレッドとしては実行されないため、アプリケーションが終了しないようにできます。 呼出し元がタイマーのタスク実行スレッドを迅速に終了する場合、その呼出し元はタイマーのcancel
メソッドを呼び出す必要があります。
タイマーのタスク実行スレッドが予期せず終了した場合(たとえば、stop
メソッドが呼び出されたため)、タイマーでタスクをスケジュールしようとすると、タイマーのcancel
メソッドが呼び出されたかのように、IllegalStateException
になります。
このクラスはスレッド・セーフです: 外部同期を必要とせずに、複数のスレッドで単一のTimer
オブジェクトを共有できます。
このクラスはリアルタイム保証を提供していません: Object.wait(long)
メソッドを使用してタスクをスケジュールします。
- APIのノート:
- Java 5.0では
java.util.concurrent
パッケージが導入されましたが、その中の並行性ユーティリティの1つがScheduledThreadPoolExecutor
で、これは特定のレートまたは遅延で繰返し実行されるタスクのスレッド・プールです。 実際、これは複数のサービス・スレッドを許可し、さまざまな時間単位を受け入れ、TimerTask
のサブクラス化を必要としない(Runnable
を実装するだけでよい)ため、Timer
とTimerTask
の組み合わせに代わる、より柔軟性の高いユーティリティです。ScheduledThreadPoolExecutor
を1つのスレッドで構成すると、Timer
と同じになります。 - 実装上のノート:
- このクラスは、多数の同時スケジュール済タスク(数千人が問題なし)にスケーリングされます。 タスク・キューを表すためにバイナリ・ヒープが内部的に使用されるため、タスクをスケジュールするコストはO(log n)になります。nは、並行してスケジュールされたタスクの数です。
すべてのコンストラクタがタイマー・スレッドを起動します。
- 導入されたバージョン:
- 1.3
- 関連項目:
-
コンストラクタのサマリー
-
メソッドのサマリー
修飾子と型メソッド説明void
cancel()
このタイマーを終了します。現在スケジュールされているタスクはすべて「破棄中」です。int
purge()
このタイマーのタスク・キューからすべての「取消済」タスクを削除します。void
指定した遅延のあとに、指定したタスクが実行されるようスケジュールします。void
指定したタスクが、指定した遅延のあとに開始され、固定遅延実行を繰り返すようにスケジュールします。void
指定した時間に指定したタスクが実行されるようスケジュールします。void
指定したタスクが、指定した時間に開始され、固定遅延実行を繰り返すようにスケジュールします。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
指定した時間に指定したタスクが実行されるようスケジュールします。 過去の時間を指定すると、タスクはただちに実行されるようスケジュールされます。- パラメータ:
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 < 0
、delay+System.currentTimeMillis()< 0
、またはperiod <= 0
の場合IllegalStateException
- タスクがすでにスケジュールされたか取り消された場合、タイマーが取り消された場合、またはタイマー・スレッドが終了した場合NullPointerException
-task
がnullである場合
-
schedule
指定したタスクが、指定した時間に開始され、固定遅延実行を繰り返すようにスケジュールします。 そのあとは、指定した期間とは別に、ほぼ一定の間隔で実行されます。固定遅延実行では、前の実行の実際の実行時間を基準にしてそれぞれの実行がスケジュールされます。 何らかの理由で実行が遅延した場合(ガベージ・コレクション、その他のバックグラウンド作業など)、そのあとの実行も遅延されます。 長時間実行では、通常、実行頻度は指定した期間(
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 < 0
、delay+System.currentTimeMillis()< 0
、またはperiod <= 0
の場合IllegalStateException
- タスクがすでにスケジュールされたか取り消された場合、タイマーが取り消された場合、またはタイマー・スレッドが終了した場合NullPointerException
-task
がnullである場合
-
scheduleAtFixedRate
指定したタスクが、指定した時間に開始され、固定頻度実行を繰り返すようにスケジュールします。 そのあとは、指定した期間とは別に、ほぼ一定の間隔で実行されます。固定頻度実行では、最初の実行のスケジュールされた実行時間を基準にしてそれぞれの実行がスケジュールされます。 何らかの理由で実行が遅延した場合(ガベージ・コレクションまたはその他のバックグラウンド作業など)、「遅れを取り戻す」ために2つ以上の実行が連続して行われます。 長時間実行では、実行頻度は、指定した期間(
Object.wait(long)
の基礎となるシステム・クロックが正確であると仮定)の逆数になります。 上記の結果として、スケジュールされる最初の時間が過去の時間である場合、実行が「間に合わなかった」ものがあればすべて「遅れを取り戻す」ためにただちに実行されるようスケジュールされます。固定頻度実行は、1時間ごとにチャイムを鳴らしたり、特定の時間に毎日スケジュールされた保守を実行するなど、絶対時間を反映する作業を繰り返すのに適しています。 また、10秒ごとに刻まれるカウントダウン・タイマーなど、決まった数の実行の合計時間が重要な作業を繰り返すのにも適しています。 さらに、固定頻度実行は、相互に同期化を保持する必要がある複数の繰返しタイマー・タスクをスケジュールするのにも適しています。
- パラメータ:
task
- スケジュールされるタスク。firstTime
- タスクが実行される最初の時間period
- 連続するタスクが実行されるミリ秒単位の間隔。- 例外:
IllegalArgumentException
-firstTime.getTime()< 0
またはperiod <= 0
の場合IllegalStateException
- タスクがすでにスケジュールされたか取り消された場合、タイマーが取り消された場合、またはタイマー・スレッドが終了した場合NullPointerException
-task
またはfirstTime
がnullである場合
-
cancel
public void cancel()このタイマーを終了します。現在スケジュールされているタスクはすべて「破棄中」です。 このメソッドは、スケジュール済タスクをcancelしないことに注意してください。 タスクを取消済とみなすには、タスク自体がTimerTask.cancel()
を起動する必要があります。このメソッドは、現在実行中のタスク(それが存在する場合)に干渉しません。 タイマーが終了すると、実行スレッドも同時に終了し、タスクはスケジュールされなくなります。
このタイマーによって呼び出されたタイマー・タスクの実行メソッドからこのメソッドを呼び出すと、進行中のタスク実行は、このタイマーで実行される最後のタスク実行になります。
このメソッドは、繰返し呼び出されます。2回目以降の呼出しには、効果はありません。
- 関連項目:
-
purge
public int purge()このタイマーのタスク・キューからすべての「取消済」タスクを削除します。 このメソッドを呼び出してもタイマーの動作は影響を受けませんが、取り消されたタスクへの参照をキューから排除します。 これらのタスクへの外部参照が存在しない場合、タスクはガベージ・コレクションの対象となります。大半のプログラムは、このメソッドを呼び出す必要はありません。 これは、多数のタスクを取り消す、まれなアプリケーション用として設計されています。 このメソッドを呼び出すと、スペースの時間がトレードされます: メソッドの実行時間は、
n + c log n
に比例します。ここで、n
はキュー内のタスクの数、c
は取り消されたタスクの数です。このタイマーでスケジュールされたタスク内からこのメソッドを呼び出すことは許可されています。
- 戻り値:
- キューから削除されたタスクの数
- 導入されたバージョン:
- 1.5
- 関連項目:
-