Java:OSのスリープ状態を監視する

2019年6月18日

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());
    }
  }
}

当然ながらスリープしている間は動作できないので、以下になる。