並列で流れる処理の中で一部分だけ順序性を持たせたいとき、他の処理が終わっているかをチェックする必要があります。
そんなとき、ひたすらチェックを繰り返すと多少なりとも負荷がかかるため、少し処理を遅らせながらチェックさせるような「遅延処理」を実装することになると思います。
Javaで処理を遅延させる方法としては以下が挙げられます。
Thread.sleep(1000)
TimeUnit.SECONDS.sleep(1)
これらの違いは以下のページに記載されていますが、処理自体に大きな違いは無い*1ものの、可読性が後者のほうが高いとされています。
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を呼んでいる