アプリ全体のすべてのタスクに使用する固定スレッドプールが1つあります(size = 100とします)。サーバーの負荷を制限するために使用されます。
タスク=Webクローラー、最初のジョブをスレッドプールに送信します。
そのジョブは、より多くのジョブを生成できます。
1つのジョブ=1つのHTTPI/O要求。
問題
実行中のタスクが1つだけで、10000のジョブが生成されたとします。
これらのジョブはスレッドプールキューにキューイングされ、100個のスレッドすべてが実行に使用されます。
2番目のタスクを送信するとします。
2番目のタスクの最初のジョブはキューの10001番目です。
最初のタスクがキューに入れられた10000ジョブの後にのみ実行されます。
したがって、これは問題です。2番目のタスクが最初のジョブを開始するのにそれほど長く待たされたくないのです。
アイデア
私の頭の最初のアイデアは、カスタムBlockingQueueを作成し、それをスレッドプールコンストラクターに渡すことです。そのキューは、タスクごとに1つずつ
、複数のブロッキングキューを保持します。
次に、そのtakeメソッドはランダムなキューを選択し、そこからアイテムを取得します。
これに関する私の問題は、タスクが終了したときにこのリストから空のキューを削除する方法がわからないことです。これは、一部またはすべてのワーカーがtakeメソッドでブロックされ、終了したタスクからのジョブを待機する可能性があることを意味します。
これはこの問題を解決するための最良の方法ですか?
本やインターネットでそのパターンを見つけることができませんでした:(
ありがとうございました!