プロデューサとコンシューマのパターンを理解することは、プロデューサとコンシューマの間で共有されるキューを使用して実装できることです。プロデューサは共有キューに作業を送信し、コンシューマはキューを取得して処理します。また、プロデューサが直接コンシューマに提出することで実装することもできます(コンシューマのエグゼキュータサービスに直接提出するプロデューサスレッド)。プロデューサコンシューマ - Executors.newFixedThreadPoolを使用
ここでは、スレッドプールの一般的な実装を提供するExecutorsクラスを見てきました。 newFixedThreadPoolメソッドは、仕様に従って、「共有された無制限キューから動作する固定数のスレッドを再利用する」。彼らはここでどのキューを話しているのですか?
プロデューサがコンシューマにタスクを直接送信する場合は、実行可能ファイルのリストを含むExecutorServiceの内部キューですか?
プロデューサが共有キューに送信する場合は、中間キューですか?
私は全体のポイントを逃しているかもしれませんが、誰かが明確にしてくださいか?
をただ明確にする: 'ExecutorService'は単なるインターフェイスです。あなたは* ExecutorService'を、同じスレッド内で実行されるとすぐに各実行可能ファイルを実行するクラスで実装することができます(そして、それだけで 'java.util.concurrent'パッケージに実装されていると思います) 。実際には、ほとんどのExecutorService実装は完全なプロデューサ - コンシューマ実装です。 –
あなたは絶対に正しいです、 'ExecutorService'は' Executor.newFixedThreadPool() 'が返すもので、' ExecutorService' *を実装しています。明確化のためにありがとう。 –
ありがとうございます。したがって、newFixedThreadPool(8)を使用してエグゼキュータサービスを作成し、その上で約1000の実行可能タスクを実行する場合は、シナリオの理解を確認してください。 1.最大で8つのスレッドが作成されます 2.処理の開始時8つのスレッドがビジーである間に、992のタスクが内部キュー に保持されます。また、その無制限キューのため、実行可能サービスに送信できるタスクの数に上限はありません。 バインドされたキューでExecutorServiceを作成すると、上記のシナリオにどのような影響がありますか?それはより良い実行するか? ありがとうございます、O. – Oxford