1

アプリ全体のすべてのタスクに使用する固定スレッドプールが1つあります(size = 100とします)。サーバーの負荷を制限するために使用されます。

タスク=Webクローラー、最初のジョブをスレッドプールに送信します。
そのジョブは、より多くのジョブを生成できます。
1つのジョブ=1つのHTTPI/O要求。

問題
実行中のタスクが1つだけで、10000のジョブが生成されたとします。
これらのジョブはスレッドプールキューにキューイングされ、100個のスレッドすべてが実行に使用されます。

2番目のタスクを送信するとします。
2番目のタスクの最初のジョブはキューの10001番目です。
最初のタスクがキューに入れられた10000ジョブの後にのみ実行されます。
したがって、これは問題です。2番目のタスクが最初のジョブを開始するのにそれほど長く待たされたくないのです。

アイデア
私の頭の最初のアイデアは、カスタムBlockingQueueを作成し、それをスレッドプールコンストラクターに渡すことです。そのキューは、タスクごとに1つずつ
、複数のブロッキングキューを保持します。 次に、そのtakeメソッドはランダムなキューを選択し、そこからアイテムを取得します。 これに関する私の問題は、タスクが終了したときにこのリストから空のキューを削除する方法がわからないことです。これは、一部またはすべてのワーカーがtakeメソッドでブロックされ、終了したタスクからのジョブを待機する可能性があることを意味します。

これはこの問題を解決するための最良の方法ですか?
本やインターネットでそのパターンを見つけることができませんでした:(

ありがとうございました!

4

2 に答える 2

2

複数のキューを使用し、アイテムを含むキューのランダムから描画します。または、どのキューが最高の優先順位を取得するかを優先することもできます。

于 2012-07-24T22:39:57.733 に答える
0

単一のPriorityBlockingQueueを使用し、再帰タスクの「深さ」を使用して優先度を計算することをお勧めします。単一のキューでは、キューが空のときにワーカーがブロックされ、複数のキューの周りにランダム化ロジックが必要ありません。

于 2012-07-26T00:39:05.550 に答える