web-dev-qa-db-ja.com

Java BlockingQueue take()vs poll()

無限ループでキューから値を消費する場合-より効率的なもの:

1)take()を介して値が使用可能になるまでキューでブロックする

while (value = queue.take()) { doSomething(value); }

2)nミリ秒間スリープし、アイテムが使用可能かどうかを確認する

while (true) {

    if ((value = queue.poll()) != null) { doSomething(value); }

    Thread.sleep(1000);
}
25
isapir

ブロッキングはより効率的です。バックグラウンドで、最初にtake()を呼び出すスレッドは、使用可能な要素がない場合はスリープ状態になり、他のスレッドに必要な処理を実行させます。キューに要素を追加するメソッドは、要素が追加されると待機中のスレッドを起動します。そのため、要素が使用可能かどうかをキューで何度もチェックするのに最小限の時間がかかります。

48
awksp

take()を使用するときは注意してください。サービスからtake()を使用しており、サービスにdb接続がある場合。

古い接続タイムアウト期間の後にtake()が返されると、古い接続例外がスローされます。

事前定義された待機時間にポーリングを使用し、返されたオブジェクトにnullチェックを追加します。

0
P Kumar