の違いThread.sleep()とTimeUnit.SECONDS.sleep()



Difference Thread Sleep



最初の結論: 使用する 一時停止、推奨事項 優先度 使用する TimeUnit クラス 睡眠 ()

TimeUnitは何ですか?

TimeUnit java.util.concurrentパッケージは次のカテゴリの1つであり、TimeUnitはより読みやすいスレッドサスペンド操作を提供します。



ソースを最初に見ると、実装のThread.sleepメソッドの元のパッケージは同じであり、時間単位の変換と検証だけではありませんが、列挙型メンバーのTimeUnitメソッドですが、読みやすさが向上しています。

public void sleep(long timeout) throws InterruptedException { if (timeout > 0) { long ms = toMillis(timeout) int ns = excessNanos(timeout, ms) Thread.sleep(ms, ns) } }

次に、オーバーロードされたメソッドであるThread.sleep()メソッドを見てみましょう。これは、長整数ミリ秒とナノ秒の長整数パラメーターを受け取ることができます。プログラマーによって引き起こされるこのような問題は、最終的には現在のスレッドのスリープが何秒かを知るのが困難です。 、分、時間、または日。次のThread.sleep()メソッドについて考えてみます。



Thread.sleep(2400000)

一見すると、現在のスレッドがあなたを待っている時間を計算できますか?一部の人はそうかもしれませんが、ほとんどのプログラマーにとって、そのようなアプローチの可読性は貧弱です。ミリ秒を秒と分に変換する必要があります。前のわずかに優れた可読性よりもその例を見てみましょう。

Thread.sleep(4*60*1000)

これは前の例よりもはるかに優れていますが、それでも最善ではありません。スリープ時間がミリ秒単位であることに気付き、現在のスレッドが4分間待機することを推測するのは簡単ではありません。 TimeUnitクラスは、DAYS、HOURS、MINUTES、SECONDS、MILLISECONDS、およびNANOSECONDSを指定することにより、この問題を解決します。 java.utils.concurrent .TimeUnit Java列挙型はアプリケーションシナリオの最良の例の1つであり、すべてのTimeUnitは列挙型インスタンスです。TimeUnitでスリープする4分間のスレッドの使用方法を見てみましょう。

TimeUnit.MINUTES.sleep(4)

同様の秒、分、時間レベルを使用して、現在のスレッドを一時停止できます。これは、スレッドのスリープメソッドよりもはるかに読みやすいことがわかります。内部的にThread.sleep()と呼ばれるTimeUnit.sleep()はInterruptExceptionをスローすることを忘れないでください。



スリープ機能に加えて、TimeUnitは、時間を異なる単位に変換するための便利な方法も提供します。たとえば、秒をミリ秒に変換する場合は、次のコードを使用できます。

TimeUnit.SECONDS.toMillis(44)

それは44,000を返します

列挙型定数の概要

NANOSECONDS nanosecond nanosecond (that is, microseconds / 1000) MICROSECONDS microseconds millionth second (ms is / 1000) Milliseconds, thousandths of a second MILLISECONDS SECONDS seconds MINUTES minutes HOURS hours DAYS days