Java:OSのスリープ状態を監視する
Javaで定期的なシステム状態の監視を行っている関係で、Windowsが勝手にスリープしてしまうと困ることになる。これを何らかの形で検出することはできるのだろうか。
StackOverflowの議論
例によってStackOverflowに議論がある。質問としてはスリープに入る時、ウェイク・アップした時の検出は可能かというものだ。
Detect OS Sleep and Wake Up events in Java
方法1~システム時刻をチェックする
システム時刻を定期的にチェックする。つまり、こんなところか。。。
new Thread() {
public void run() {
while (true) {
Thread.sleep(1000);
long currentTime = System.currentTimeMillis();
// 前の値と比較
}
}
}.start();
方法2~Windowsのブロードキャストを拾う
Windowsのみの場合だが、Windowsが発生するブロードキャストを拾うという方法がある。
Java/C++ PC Standby Detect and Prevent
ここで独自dll付のライブラリが公開されている。つまり、JNA等は使われていない。また、コメントを見る限り、これは32ビット用であり、64ビット用は無いようだ。
おそらくはJNA等を使って書き直した方が良いだろう。
Thread.sleepはどうなるのか?
ここで疑問に思うことは、Thread.sleep(60 * 1000)などとやった場合、つまり60秒待つのだが、途中でスリープが入るとスリープも含めて60秒なのか、あるいはスリープを除外して60秒待つのかということなのだが。。。。
以下のようなプログラムで確認、
import java.util.*;
public class Sleep {
public static void main(String[]args) throws Exception {
while (true) {
Thread.sleep(60 * 1000);
System.out.println(new Date());
}
}
}
当然ながらスリープしている間は動作できないので、以下になる。