無限ループでキューから値を消費する場合-より効率的なもの:
1)take()を介して値が使用可能になるまでキューでブロックする
while (value = queue.take()) { doSomething(value); }
2)nミリ秒間スリープし、アイテムが使用可能かどうかを確認する
while (true) {
if ((value = queue.poll()) != null) { doSomething(value); }
Thread.sleep(1000);
}
ブロッキングはより効率的です。バックグラウンドで、最初にtake()
を呼び出すスレッドは、使用可能な要素がない場合はスリープ状態になり、他のスレッドに必要な処理を実行させます。キューに要素を追加するメソッドは、要素が追加されると待機中のスレッドを起動します。そのため、要素が使用可能かどうかをキューで何度もチェックするのに最小限の時間がかかります。
take()
を使用するときは注意してください。サービスからtake()
を使用しており、サービスにdb接続がある場合。
古い接続タイムアウト期間の後にtake()
が返されると、古い接続例外がスローされます。
事前定義された待機時間にポーリングを使用し、返されたオブジェクトにnullチェックを追加します。