2016-05-29 4 views
4

プロデューサ/コンシューマの問題では、LinkedBlockingQueueを共有バッファとして使用したいと考えています。BlockingQueueに最大ブロック時間はありますか

プロデューサスレッドは、put()メソッドを使用してキューに要素を配置し、コンシューマスレッドはtake()メソッドを使用してキュー上の要素を消費します。

私の質問は、キューが空でコンシューマスレッドがtake()メソッドを呼び出す場合、プロデューサがキューに要素を置くまでスレッドがブロックされていることです。しかし、最大ブロック時間のようなものがありますか? put()が呼び出されるまで消費者スレッドがブロックされることは間違いないと思いますか?

私は、永遠にブロックのようなものはないと言っている人がいると聞いています。本当ですか?

答えて

5

いいえtake()メソッドで待機のタイムアウトがありません。そしてdocumentationは、任意のタイムアウトを言及していない:

取得および必要に応じて要素が利用可能になるまで待って、このキューの先頭を削除します。

一方、pollメソッドは、引数としてタイムアウトを取ることができます。

1

LinkedBlockingQueueの実装を見ると、take()メソッド は、countが0以外の場合にのみ終了するループ内でnotEmpty条件を待っています。

はい、条件が満たされるまで永遠に待機します。つまり、誰かが要素を置くことを意味します。

関連する問題