8

私のプロジェクトでは、クライアントから作業要求を受け取る Java 実行フレームワークを構築しています。作業 (さまざまなサイズ) は一連のタスクに分割され、処理のためにキューに入れられます。各タイプのタスクを処理する個別のキューがあり、各キューは ThreadPool に関連付けられています。ThreadPools は、エンジンの全体的なパフォーマンスが最適になるように構成されています。

この設計は、リクエストの負荷を効果的に分散するのに役立ち、大きなリクエストがシステム リソースを占有することはありません。ただし、一部のキューが空で、それぞれのスレッド プールがアイドル状態の場合、ソリューションが無効になることがあります。

これを改善するために、負荷の高いキューが他の ThreadPools から助けを得ることができるように、作業/タスクを盗む手法を実装することを考えていました。ただし、Java では複数のキューを ThreadPool に関連付けることができず、ワーク スティーリングの概念をサポートしていないため、独自の Executor を実装する必要がある場合があります。

Fork/Join について読んでください。しかし、それは私のニーズに合わないようです。このソリューションを構築するための提案や代替方法は非常に役立ちます。

ありがとうアンディ

4

3 に答える 3

4

Executors.newWorkStealingPool

Java 8 には、Executorsクラス内のファクトリ メソッドとユーティリティ メソッドがあります。Executors.newWorkStealingPool

これはワークスティーリング スレッド プールの実装であり、まさにあなたが望むものだと思います。

于 2016-02-20T14:37:59.607 に答える
2

ForkJoinPoolを検討しましたか? fork-join フレームワークは優れたモジュール方式で実装されているため、ワークスティーリング スレッド プールをそのまま使用できます。

于 2012-04-14T13:02:14.107 に答える
1

「プライマリ」キューと0個以上のセカンダリキューに支えられたカスタムBlockingQueue実装を実装できます(主にoffer()andメソッドを実装する必要があると思います)。take()take は、空でない場合は常にプライマリ バッキング キューから取得します。それ以外の場合は、セカンダリ キューから取得できます。

実際、すべてのワーカーがすべてのキューにアクセスできる 1 つのプールを持つ方がよいかもしれませんが、特定のキューを「優先」します。異なるワーカーに異なる優先順位を割り当てることで、最適な作業比率を見つけることができます。完全にロードされたシステムでは、ワーカーは最適な比率で作業する必要があります。過負荷のシステムでは、ワーカーが他のキューを手伝うことができるはずです。

于 2012-04-14T12:50:32.780 に答える