1

結果を返す前に複数の小さな計算を行う Web サービスがあります。ExecutorServiceマスター - ワーカー パターンを実装する方法として提供されたを使用したいExecutors.newFixedThreadPool()(つまり、呼び出しinvokeAllて、すべての結果が終了するまでスレッドを待機させる)。理想的には、すべての Web サービス スレッドが同じエグゼキュータ サービスを使用して、すべてが独自のスレッド プールを作成する必要がなく、システムのすべての処理時間を消費する 1 つの大きなプールを共有できるようにします。

このアプローチに関する質問:

  • invokeAll複数のスレッドから関数にアクセスしても安全ですか。
  • エグゼキュータ サービスはリクエストを順番に処理しますか (つまり、最初にスレッド 1 のすべてのタスクを処理し、次にスレッドのタスクを処理します)。
  • 10 個のワーカー スレッドを使用し、受信する要求の数に応じて使用可能なスレッドの最大数を設定する方法はありますか。つまり、1 つの要求があるとします。その要求に対して 10 個のスレッドすべてが使用されます。2 つのリクエストがある場合、リクエストごとに 5 つのスレッドに分割されます。
4

3 に答える 3

2

Java EE サーバーで操作する場合、独自にスレッドを作成しないでください。これは良い状況ではないことを認識しているため、使用しているアプリ サーバーに応じて代替案を調査する必要があります。WebSphere または Weblogic の場合は、必要な機能を正確に提供する commonj 仕様のWorkManagerを使用する必要があります。JBossの実装もあります。

最後の手段として、管理された環境で独自のスレッドを作成することを検討してください。

于 2008-11-27T16:22:03.080 に答える
1

invokeAll は使用しないでください。並行して実行するサブタスクごとに、各リクエストで ExecutorService.submit を呼び出します。スレッド プールは、タスクのスケジューリングを処理します (それが設計された目的です!)。

はい、 Executors.newFixedThreadPool() を使用すると、各リクエストがキューに入れられるため、順番に処理されます。

于 2008-11-27T14:53:04.163 に答える
0

invokeAll() ではなくSemaphoreを使用する必要があると思います

于 2008-11-27T14:57:46.963 に答える