public class Timer extends Object
各Timer
オブジェクトと対応するのは、タイマーのタスクをすべて連続して実行するために使用される、単一のバックグラウンド・スレッドです。 タイマー・タスクは迅速に実行される必要があります。 タイマー・タスクの完了に時間がかかりすぎると、タイマーのタスク実行スレッドが「占有」されます。 これにより後続のタスクの実行が遅れ、違反したタスクの完了時(完了した場合)に、立て続けに「まとめて」実行されることになります。
Timer
オブジェクトの最後のライブ参照が終了し、かつ、未処理のタスクがすべて実行されると、タイマーのタスク実行スレッドは正常に終了し、ガベージ・コレクションの対象となります。 ただし、これには限りなく長い時間がかかる場合があります。 デフォルトでは、タスクの実行スレッドはデーモン・スレッドとしては実行されないため、アプリケーションが終了しないようにできます。 タイマーのタスク実行スレッドをただちに終了させる場合、呼出し側はタイマーのcancel
メソッドを呼び出す必要があります。
stop
メソッドの呼び出しなどによりタイマーのタスク実行スレッドが予想外の時間に終了した場合、タイマーのタスクをスケジュールしようとすると、タイマーのcancel
メソッドが呼び出された場合と同様に、IllegalStateException
が発生します。
このクラスはスレッドセーフです。外部の同期化を行わなくても、複数のスレッドで単一のTimer
オブジェクトを共有できます。
このクラスでは、リアルタイムは保証されません。Object.wait(long)
メソッドを使用して、タスクがスケジュールされます。
Java 5.0ではjava.util.concurrent
パッケージが導入されましたが、その中の並行性ユーティリティの1つがScheduledThreadPoolExecutor
で、これは特定のレートまたは遅延で繰返し実行されるタスクのスレッド・プールです。 実際、これは複数のサービス・スレッドを許可し、さまざまな時間単位を受け入れ、TimerTask
のサブクラス化を必要としない(Runnable
を実装するだけでよい)ため、Timer
とTimerTask
の組み合わせに代わる、より柔軟性の高いユーティリティです。 ScheduledThreadPoolExecutor
を1つのスレッドで構成すると、Timer
と同じになります。
実装にあたっての注意:このクラスは、並行してスケジュールされた多数のタスクをスケーリングします(数千でも問題はない)。 タスク・キューを表すためにバイナリ・ヒープが内部的に使用されるため、タスクをスケジュールするコストはO(log n)になります。nは、並行してスケジュールされたタスクの数です。
実装にあたっての注意: すべてのコンストラクタはタイマー・スレッドを開始します。
- 導入されたバージョン:
- 1.3
- 関連項目:
TimerTask
,Object.wait(long)
-
コンストラクタのサマリー
-
メソッドのサマリー
修飾子と型 メソッド 説明 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
指定した時間に指定したタスクが実行されるようスケジュールします。 過去の時間を指定すると、タスクはただちに実行されるようスケジュールされます。- パラメータ:
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()現在スケジュールされているタスクを破棄して、このタイマーを終了します。 現在実行中のタスク(ある場合)には干渉しません。 タイマーが終了すると、実行スレッドも同時に終了し、タスクはスケジュールされなくなります。このタイマーによって呼び出されたタイマー・タスクの実行メソッドからこのメソッドを呼び出すと、進行中のタスク実行は、このタイマーで実行される最後のタスク実行になります。
このメソッドは、繰返し呼び出されます。2回目以降の呼出しには、効果はありません。
-
purge
public int purge()取り消されたすべてのタスクを、このタイマーのタスク・キューから削除します。 このメソッドを呼び出してもタイマーの動作は影響を受けませんが、取り消されたタスクへの参照をキューから排除します。 これらのタスクへの外部参照が存在しない場合、タスクはガベージ・コレクションの対象となります。大半のプログラムは、このメソッドを呼び出す必要はありません。 これは、多数のタスクを取り消す、まれなアプリケーション用として設計されています。 このメソッドを呼び出すと、処理時間よりメモリー効率が優先されるため、メソッドの実行時間がn + c log nに比例する場合があります。ここで、nはキュー内のタスクの数、cは取り消されたタスクの数を表します。
このメソッドは、このタイマーでスケジュールされたタスク内から呼び出すことができます。
- 戻り値:
- キューから削除されたタスクの数
- 導入されたバージョン:
- 1.5
-