よく、定期間隔で処理をしたい場合、Thread.sleep()を使用したりするかと思いますが、
そのときに、日付/時刻を変えたら、
スリープ時間が予想以上にかかる!
それは、日付時刻を見てスリープ時間をチェックしているためのようで・・・
以下のソースを、VM上Linuxで動作確認。
JavaのバージョンはJava5です。
import java.util.Date;
public class SleepTest {
/**
* @param args
* @throws UnknownHostException
*/
public static void main(String[] args) {
Sleeper s = new Sleeper();
s.start();
}
}
class Sleeper extends Thread {
public void run() {
Date d = null;
while(true) {
d = new Date(System.currentTimeMillis());
System.out.println("before sleep:" + d.toString());
try {
Thread.sleep(1000);
} catch(InterruptedException iEx){
iEx.printStackTrace();
break;
}
d = new Date(System.currentTimeMillis());
System.out.println("after sleep:" + d.toString());
}
}
}
======== 実行結果 ========
before sleep:Thu Feb 12 00:00:41 JST 2009
after sleep:Thu Feb 12 00:00:42 JST 2009
before sleep:Thu Feb 12 00:00:42 JST 2009
after sleep:Thu Feb 12 00:00:43 JST 2009
before sleep:Thu Feb 12 00:00:43 JST 2009
<==== date -s 2009/2/12 を実行して 2009年 2月 12日 木曜日 00:00:00 JST に変更
#1分ぐらい待つのか!?と思った時位に・・・
after sleep:Thu Feb 12 00:00:44 JST 2009
before sleep:Thu Feb 12 00:00:44 JST 2009
after sleep:Thu Feb 12 00:00:45 JST 2009
before sleep:Thu Feb 12 00:00:45 JST 2009
after sleep:Thu Feb 12 00:00:46 JST 2009
before sleep:Thu Feb 12 00:00:46 JST 2009
NTPとか、うっかりコマンドで変更した時に
動作待ち時間が変わるかも・・・だから気をつけなきゃって思った瞬間でした。
# そんなこんなで数ヶ月DB触っていない・・・・(泣