Javaで処理を遅延(一定時間停止)させる方法

並列で流れる処理の中で一部分だけ順序性を持たせたいとき、他の処理が終わっているかをチェックする必要があります。

そんなとき、ひたすらチェックを繰り返すと多少なりとも負荷がかかるため、少し処理を遅らせながらチェックさせるような「遅延処理」を実装することになると思います。

Javaで処理を遅延させる方法としては以下が挙げられます。

  • Thread.sleep(1000)
  • TimeUnit.SECONDS.sleep(1)

これらの違いは以下のページに記載されていますが、処理自体に大きな違いは無い*1ものの、可読性が後者のほうが高いとされています。

Java スレッドをスリープさせる方法 - Java入門

Thread.sleep(long)は引数としてミリ秒のlong型を受け取る形となっています。1秒停止させる場合は1,000ミリ秒ということで1000を渡す必要があります。

一方で、TimeUnit.SECONDS.sleep(1)の場合は以下のEnumを記載することで引数の単位を指定できます。

  • TimeUnit.SECONDS.sleep(1) 秒単位
  • TimeUnit.MILLISECONDS.sleep(1) ミリ秒単位(1/1,000秒)
  • TimeUnit.MICROSECONDS.sleep(1) マイクロ秒単位(1/1,000ミリ秒)
  • TimeUnit.NANOSECONDS.sleep(1) ナノ秒単位(1/1,000マイクロ秒)

使いどころがあるかはわかりませんが、以下のような単位も用意されています。

  • TimeUnit.DAYS.sleep(1) 日単位
  • TimeUnit.HOURS.sleep(1) 時単位
  • TimeUnit.MINUTES.sleep(1) 分単位

前者にも一応、Thread.sleep(long, long)という第1引数にミリ秒、第2引数にナノ秒を渡せるメソッドが提供されており、ミリ秒も負数でなければ許容されるようですので、組み合わせてマイクロ秒やナノ秒の遅延は実装可能だと思います。

 

 

また、別の方法としてはTimerクラスのsetInitialDelay(int initialDelay)というメソッドも使えます。

遅延時間及び初期遅延時間を設定する - Timerクラス - Swing

 

…書いてるうちに、何故この記事を書こうとしたのか忘れましたが、この辺で。

*1:というかTimeUnitの中でThread.sleepを呼んでいる