2011-10-08 1 views
4

take()methodを使用してBlockingQueueの要素にスレッドを吸着させると、(中断されていない限り)要素が利用可能になるのを待つことになります。パフォーマンスのためにBlockingQueue.take()でスレッドを明示的にスリープ解除する必要がありますか?

私は2つの質問があります。

i)が自動的にウェイクアップするとすぐ要素が利用可能になるか、遅延後に(すなわち、スレッドをチェック自体)があるとして、スレッドですか?

ii)遅延がある場合、スレッドを起床させるのは意味がありますか(たとえば明示的に中断して)?レイテンシとパフォーマンスについて考えています。

答えて

4

追加の遅延はありません。メソッド呼び出しは、要素が利用可能であるか、スレッドが中断された場合に返します。

Retrieves and removes the head of this queue, waiting if necessary until an element becomes available. 

Returns: 
    the head of this queue 
Throws: 
    InterruptedException - if interrupted while waiting 

BlockinQueueは(のimpl。ArrayBlockingQueueの)これを自動的にやっています。

// in add etc. 
notEmpty.signal(); 

// in take() 
while(count == 0) 
    notEmpty.await(); 
+0

@DownVoter:コメントを残してください。 – MasterCassim

+0

私はdownvoterは、(いいえ、私ではなかった:)と仮定することができます、 '遅れはありません'に反対しています - スケジュール遅延があるかもしれません。コンシューマスレッドは、プロデューサがアイテムをポストするときに準備されますが、コンシューマよりも優先度の高い実行可能/実行スレッドのセットがコアの数と同じかそれ以上の要素を持つ場合、すぐには実行されません。どちらの方法でも、割り込みやその他のスレッドによる手間は何も変わりません。遅れを最小化する唯一の方法は、消費者が十分に高い優先度を有することを保証することである。 –

+0

説明をありがとう。私はスピードアップできる追加の遅延を参照していたので私の答えを編集しました。 – MasterCassim

関連する問題