3

私が開発するソフトウェアが大きく複雑になり、そのさまざまな部分で独自の方法でエグゼキュータが使用されることは、私の実践では珍しいことではありません。パフォーマンスの観点からは、各部分で異なるスレッドプール構成を使用することをお勧めします。ただし、保守性とコードの使いやすさの点から、スレッド、同時実行性、およびCPU使用率に関連するすべてのものが、一元化された場所に保持および構成されていると、より望ましいでしょう。

同時実行またはスケジューリングが必要な各クラスに独自のスレッドプールを作成させることは、ライフサイクルとスレッドの総数を制御することが難しいため、OKではありません。

ある種のExecutorManagerを作成し、アプリケーションの周りに1つのスレッドプールを渡すこともOKではありません。タスクのタイプと送信率によっては、作業キューとスレッドプールサイズの不適切に構成された組み合わせがパフォーマンスに悪影響を与える可能性があるためです。

したがって、問題は、この問題に対処するいくつかの一般的なアプローチがありますか?

4

2 に答える 2

2

実行するタスクに応じて異なる構成が可能な2つまたは3つのスレッドプールを作成します。3つを超える異なる同時アクションがある場合は、より大きな問題が発生します。

プールは必要に応じて(たとえば名前で)注入できます。さらに、AOP(たとえばaspectj)を使用して特定のプール/エグゼキューターで定義されたメソッドを実行するためのアノテーションを作成します。

アノテーションリゾルバーは、すべてのプール/エグゼキューターにアクセスし、アノテーションで指定されたものを使用してタスクを送信する必要があります。

例えば:

@Concurrent ("pool1")
public void taskOfTypeOne() {
}

@Concurrent ("pool2")
public void taskOfTypeTwo() {
}
于 2012-12-04T14:29:49.573 に答える
1

あなたが探しているのは、依存性注入または制御の反転です。Java の最も一般的な DI フレームワークの 1 つはSpringです。通常の Java オブジェクトを作成しますが、特定の注釈を付けるか、XML で構成して、それらを結び付けます。このようにして、さまざまなExecutorServiceインスタンスを 1 か所で構成し、それらを必要とするクライアント クラスに (おそらく名前で) 注入するように要求できます。

于 2012-12-04T14:37:52.543 に答える