42

場合によっては、私たちのほとんどは次のように書きます。

try {
   Thread.sleep(2000); 
} catch (InterruptedException e) {
   ; // do nothing
}

正しいか間違っているか、一部のテスト ハーネスでのみ許容されるかどうかは、私の主張ではありません。私のポイントは、同じコードをより簡潔に次のように書くことができるということです。

  LockSupport.parkNanos(2000* 1000000);

あるアプローチを他のアプローチよりも優先する必要がある理由はありますか。

4

3 に答える 3

21

読みやすさ:Thread.sleepかなり直感的な意味があります。(別の開発者に)あなたの使用法をどのように説明LockSupport.parkNanosしますか?その説明が主に「現在のスレッドスリープ状態にしたい」で構成されている場合は、確かThread.sleepにもっと説明的です。

簡潔さは、割り込み処理の欠如に由来します。したがって、必要に応じてこれを行うラッパーメソッドを作成し、例外をとして伝播しますRuntimeException。ちなみに、ラッパーメソッドを作成している場合は、どちらの実装も使用できますが、もちろん、別のスレッドが「スリープ」スレッドを中断するのと同じ方法でアンパークする可能性があります...

于 2012-05-01T12:59:00.070 に答える
19

メソッドのドキュメントはparkNanos、メソッドが戻ることができる条件を提供します。これらの条件の 1 つは、偽の (つまり、理由のない) 呼び出しが を返すことです。したがって、基本的には、偽のウェイクアップや、待機中のスレッドを「パーク解除」する他のスレッドを気にしないのであれば、それを使用しても問題ありません。そしてもちろん、Jon のコメントは、どちらか一方を優先する理由をほぼ正確に示しています。

于 2012-05-01T13:00:25.763 に答える
1

LockSupportのアプリケーションははるかに制限されており、例外処理をサポートしていません。単一のスレッドのみをロックする必要がある場合は、問題ありません。

APIから:

これらのメソッドは、高レベルの同期ユーティリティを作成するためのツールとして使用するように設計されており、それ自体はほとんどの同時実行制御アプリケーションには役立ちません。

于 2012-05-01T12:57:42.567 に答える