質問です。プロセス プログラムの複数のスレッドが、1 つの静的 java.util.arrayqueue から順次読み取ることができますか? プロセス プログラムの 3 つのスレッドが実行されていて、3 つのデータ オブジェクトが arrayqueue に到着した場合、各スレッドが 1 つのデータ オブジェクトを処理するか、1 つのスレッドだけが 3 つのデータ オブジェクトすべてを処理します。
4 に答える
あなたは生産者と消費者のパターンを説明しています。
いくつかのポイント
3 つのスレッドを生成し、それらがそれぞれループして同じキューから読み取った場合、すべてのスレッドがキュー上のアイテムを消費しようとします。各スレッドが消費するアイテムの数についての保証はありません。これは、JVM (または OS レベル) のスレッドのスケジューラに完全に依存します。一般的に言えば、多数の同様のアイテムがキューに追加された場合、各スレッドはほぼ同じ量のアイテムを消費します。
ArrayQueue はスレッドセーフではないため、このユースケースには適していません。より良い選択は、ConcurrentLinkedQueue または ConcurrentBlockingQueue です。
あなたの質問に直接答えるには、はい、複数のスレッドが同じキューから読み取ることができますが、上記を考慮してください。
通常、同期されたスレッドを使用して、各スレッドが1つの入力を読み取るようにします。
あなたの質問に答えるために、この文脈での行動を決定することはできません。スレッドの同期を強制して、各スレッドが1つだけでなく、常にビジーであることを確認する必要があります。
この場合、同期を使用するか、より適切なデータ構造に切り替える必要があります。
arrayqueue のドキュメントから: それらはスレッドセーフではありません。外部同期がない場合、複数のスレッドによる同時アクセスはサポートされません
arrayqueue の push/pop がスレッドセーフであり、使用されるシグナルが実行中のスレッドの数を制限しないと仮定します。
使用可能なコアの数と、スレッドがデータを処理できる速度によって異なります。3 つの空きコアがあり、キューに入れられたタスクに時間がかかる場合、3 つのスレッドが 3 つのタスクを同時に実行する可能性があります。タスクが非常に短く、システムに負荷がかかり、データ送信時に 1 つのスレッドしか空いていない場合、1 つのスレッドが競合して、別のスレッドが使用可能になる前に 3 つの項目すべてを実行する可能性があります。タスクよりもコアが少ない場合は、明らかに [いいえ。のコア] タスクを同時に実行できます。
それらの可能性を組み合わせてください。