今日の役に立たない一言 - Today’s Trifle! -

古い記事ではさまざまなテーマを書いていますが、2007年以降はプログラミング関連の話がほとんどです。

java.util.TimerTask と javax.swing.Timer に関する注意

developerWorks で公開された「Javaアプリケーションで繰り返しタスクをスケジューリングする」を読んでいて思い出した。
この記事では、java.util.TimerTask を使用する方法を紹介している。用途は違うが、java.util.TimerTask と似たような機能を持つクラスとして、javax.swing.Timer がある。これらのクラスは、System.currentTimeMillis() で取得したシステム時刻を基準にしてイベントをスケジュールしているため、システム時刻を過去に戻されると、戻した時点での時刻に追いつくまでの間、繰り返しタスクのもととなるイベントが全く発生しなくなるという問題点を抱えている。
同一システム上でNTPクライアントを動作させるなどして、システム時刻のズレを自動的に調整していれば問題は起こらない。しかし、手動の保守で時刻合わせを行っているシステムでは確率二分の一でトラブルが発生する可能性がある。
時間のズレが数秒程度ならイベントが発生しなくても大きな問題にはなりにくいが、手動で時刻合わせをするのは、きっと分単位で時刻がズレているだろうから、大きな問題の要因となる可能性は高い。