9

私の知る限り、リンクされたリストと配列の両方が際限なく大きくなる可能性がありますか、それとも間違っていますか? しかし、Executor Service のドキュメントを確認すると、次のように表示されます。

無制限のキュー。無制限のキュー (事前定義された容量のない LinkedBlockingQueue など) を使用すると、すべての corePoolSize スレッドがビジー状態のときに、新しいタスクがキューで待機します。したがって、corePoolSize を超えるスレッドが作成されることはありません。(したがって、 maximumPoolSize の値は何の効果もありません。)

容量が定義されている場合、Unbounded Queueプロパティは変化しますか?LinkedBlockingQueue

そして、これはのために書かれましたArrayBlockingQueue

制限されたキュー。バインドされたキュー (たとえば、ArrayBlockingQueue) は、有限の maximumPoolSizes で使用するとリソースの枯渇を防ぐのに役立ちますが、調整と制御がより困難になる可能性があります。キュー サイズと最大プール サイズは互いにトレードオフされる可能性があります。大きなキューと小さなプールを使用すると、CPU 使用率、OS リソース、およびコンテキスト切り替えのオーバーヘッドが最小限に抑えられますが、スループットが人為的に低くなる可能性があります。タスクが頻繁にブロックされる場合 (たとえば、I/O バウンドの場合)、システムは、他の方法で許可されているよりも多くのスレッドの時間をスケジュールできる場合があります。一般に、小さなキューを使用するには、より大きなプール サイズが必要になるため、CPU のビジー状態が維持されますが、許容できないスケジューリング オーバーヘッドが発生する可能性があり、スループットも低下します。

4

5 に答える 5

14

ArrayBlockingQueue無限に成長できるのはなぜだと思いますか。独自のドキュメントから:

これは従来の「境界付きバッファ」であり、固定サイズの配列がプロデューサーによって挿入され、コンシューマーによって抽出された要素を保持します。一度作成すると、容量を増やすことはできません。満杯のキューに要素を入れようとすると、操作がブロックされます。空のキューから要素を取得しようとすると、同様にブロックされます。

言い換えれば、一度いっぱいになると、いっぱいになり、成長しません。

ArrayListひょっとして、これも配列でサポートされているが、必要に応じてこれを拡張するものと混同していませんか?

LinkedBlockingQueue に容量が定義されている場合、Unbounded Queue プロパティは変更されますか?

はい、そのため、 Javadocsで「オプションで制限されている」と説明されているのはなぜですか。さらに、ドキュメントには次のように記載されています(強調は私のものです):

オプションの容量制限コンストラクター引数は、過剰なキューの拡張を防ぐ方法として機能します。容量が指定されていない場合、Integer.MAX_VALUE と等しくなります。リンクされたノードは、キューが容量を超えない限り、挿入のたびに動的に作成されます。

于 2012-08-06T14:51:39.850 に答える
4

LinkedBlockingQueueのjavadoc には次のように書かれています。

リンクされたノードに基づいて、オプションで制限されたブロッキング キュー。[...]

オプションの容量制限コンストラクター引数は、過剰なキューの拡張を防ぐ方法として機能します。容量が指定されていない場合、Integer.MAX_VALUE と等しくなります。

ArrayBlockingQueueのjavadoc は次のように述べています。

配列に裏打ちされた制限付きブロッキング キュー。[...]

これは、固定サイズの配列がプロデューサーによって挿入され、コンシューマーによって抽出された要素を保持する、古典的な「境界付きバッファー」です。一度作成すると、容量を増やすことはできません

したがって、LinkedBlockingQueue は制限付きまたは制限なしにすることができますが、ArrayBlockingQueue は常に制限付きです。

于 2012-08-06T14:55:10.817 に答える
3

ArrayBlockingQueueのドキュメントから

配列によって裏打ちされた制限付きブロッキング キュー。このキューは要素を FIFO (先入れ先出し) で順序付けます。キューの先頭は、最も長い時間キューにあった要素です。キューの末尾は、最も短い時間キューにあった要素です。新しい要素はキューの末尾に挿入され、キューの取得操作はキューの先頭にある要素を取得します。

このクラスは制限されるように設計されているため、ArrayBlockingQueue のすべてのコンストラクターが容量を使用していることに気付いた場合。この選択が行われたのは、並行キューが必要な場合、おそらく ArrayList のサイズ変更に伴うオーバーヘッドが必要ないためです。したがって、無制限のキューが必要な場合は、このオーバーヘッドを伴わない LinkedBlockingQueue の方が適しています。

于 2012-08-06T14:55:00.617 に答える
3

私の知る限り、リンクされたリストと配列の両方が際限なく大きくなる可能性があるか、それとも間違っていますか

無制限のサイズとしてリンクされたリスト。配列は固定サイズです。ArrayList は配列をラップし、より大きな配列が必要になったときにそれを置き換えます。

LinkedBlockingQueue の容量が定義されている場合、Unbounded Queue プロパティも同様に変更されます。

LinkedBlockingQueue に最大容量がある場合、制限されますが、デフォルトではこのように使用されません。

于 2012-08-06T14:52:50.027 に答える