2012-05-01 5 views
27

、私たちのほとんどは、このようなことを書く:のJava:いくつかのケースでのThread.sleep(...)対LockSupport.parkNanos

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

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

LockSupport.parkNanos(2000* 1000000); 

は、私は他の上で1つのアプローチを好むべき理由何らかの理由があります。

答えて

14

メソッドparkNanosは、メソッドが返すことができる条件を提供します。これらの条件の1つは、コールは偽りに(すなわち理由なしで)を返します。だから基本的には、偽の目覚めや他のスレッドが待っているスレッドを考慮しないように気を付けなければ、それを使っても問題ありません。もちろん、Jonのコメントは、他のものを好む理由をかなり釘付けにしています。

0

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

APIから:

これらの方法は 、より高いレベルの同期化ユーティリティを作成するためのツールとして使用するように設計されており、自身 で最も同時実行制御アプリケーションのために有用ではないされています。

+6

ほとんどの場合、例外処理はほとんど役に立ちません。コーダーは、スレッドが中断されないことを保証することができます...したがって、私の質問 – Zo72

11

可読性:Thread.sleepはかなり直感的な意味を持ちます。 は、別の開発者にを説明し、LockSupport.parkNanosを使用しますか?その説明が主に「現在のスレッドからのスリープを欲しければ」というメッセージが表示されている場合は、確かにThread.sleepがわかりやすくなります。

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

関連する問題