
■ 処理を待機させたい
諸般の事情で、ある一定時間処理を待機させる必要が生じました。
さて、Excelマクロ(VBA)やPowerShell、COBOLでは作った事があるのだが、Javaではどうやればよいのだろうか?
■ Threadクラス
どうやら、Threadクラスを使う事で実現できそうです。
Threadクラスってマルチスレッドのためのものだと思っていたのですが、Threadクラスのマニュアルを見ると「スレッドとは、プログラム内での実行のスレッドのこと。並列に実行される複数のスレッドを使用できる。」と言ったことが書いてあります。
ふむ、確かにマルチスレッドのためのクラスとは書いてないですね。
■ 使ってみた
Threadクラスのsleepメソッドで待機してくれました。
// 待機時間(ミリ秒)
long waitChkTime = 10000;
// 指定した秒数、スレッドを停止します。
try {
Thread.sleep(waitChkTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
sleepメソッドの引数は、待機させたい時間をミリ秒で指定します。上のサンプルでは、10,000ミリ秒(つまり10秒)停止させています。
なお、例外として、InterruptedExceptionが発生するので、try ~ catch で拾っています。
■ 補足です
sleepメソッドは待機処理をミリ秒の単位まで指定できるのですが、厳密に指定した時間待機していから再開される訳ではないようです。
まぁ、考えてみればあたり前ですが、停止させたスレッドが再開したってOS側に渡すだけですからね。いつ実行されるかはJavaというよりは、OS側の問題というか。
ってことで、sleepメソッドは「最低限、指定した時間待機した後で処理が再開される」という事になるようですね。
■ 後書き
待機処理と言えば、PowerShellは、Start-Sleepコマンドレット(powerShellで無限ループと待機処理)ですし、Excelなら、Application.Wait、Javaは今回のこれですね。
Excelのヤツがちと使いづらいですが、言語自体に待機処理があって簡単に使えて便利です。それに比べてCOBOLときたら...
COBOLに待機する処理なんてない(確か、無かったはず)ので、停止させたい未来の時刻を作成しておいて、その時刻を超えたら終了するループを作って対応してました。でもこれ、疑似的に待機させてるだけで、実際には処理が動き続けるんですよね。
昔、ホストコンピュータで開発していた時に実装を間違えて、無限ループ&ディスクパンク(何を思ったか、ログを吐かせていた)でシステム全体を停止させてしまったのはいい思い出です。
...はい、怒られました。
スポンサードリンク


