私のプロジェクトでは、クライアントから作業要求を受け取るJava実行フレームワークを構築しています。作業(さまざまなサイズ)は一連のタスクに分割され、処理のためにキューに入れられます。各タイプのタスクを処理するキューが別々にあり、各キューはThreadPoolに関連付けられています。 ThreadPoolsは、エンジンの全体的なパフォーマンスが最適になるように設定されています。仕事/仕事Stealing ThreadPoolExecutor
この設計は、要求を効果的に負荷分散するのに役立ち、大きな要求がシステムリソースを大量に消費することにはなりません。ただし、キューの一部が空で、それぞれのスレッドプールがアイドル状態になっていると、ソリューションが無効になることがあります。
これをさらにうまくするために、負荷の高いキューが他のThreadPoolsから助けを得ることができるように、作業/タスクのスティッキング技術を実装することを考えていました。しかし、これはJavaが複数のキューをThreadPoolに関連付けることを許さず、仕事盗みの概念をサポートしないので、私自身のExecutorを実装する必要があります。
Fork/Joinについて読むが、私のニーズに合っていないようだ。このソリューションを構築するための提案や代替方法は非常に役に立ちます。
おかげ アンディ
すべてのCPUを忙しくする方法について考える必要があります。 CPUを最大限に活用している場合、スレッドの一部がアイドル状態であるかどうかは関係ありません。 –
スレッドプールにcpusを持つスレッドと同じ数のスレッドがある場合、他のすべてのスレッドプールがアイドル状態であっても、個々のスレッドプールはすべてのCPUを「盗む」ことができます。 –
@PeterLawrey - それは本当ですが、プールがたくさんある場合、すべてのプールのすべてのスレッドが同時に動作しているとパフォーマンスが低下する可能性があります。 – jtahlborn