2

Web メソッドの 1 つで 2 つのスレッドを作成し、データを挿入するためにさらに 2 つの Web サービスを呼び出す Web サービスがあります。現在、私の元の Web サービスは、1,000 から 10,000 の範囲の呼び出しを並行して受信することが期待されています。したがって、このような呼び出しごとに、内部で Web サービスがさらに 2 つのスレッドを作成することを理解できます。このような負荷がかかるようにアプリケーション サーバーを調整済みです。私を信じて。

元の Web サービスで将来のオブジェクトを使用して固定スレッド プール サイズの Executor を使用しましたが、他の 2 つの Web サービスへの呼び出しが順次処理されているように見えました。すべてのチュートリアル/コード スニペットをチェックしました。私のコードは正しいようです。

ExecutorService executor = Executors.newFixedThreadPool(size);
Future<Boolean> futureOne = executor.submit(new MyThread(serviceOne, data));
Future<Boolean> futureTwo = executor.submit(new  MyThread(serviceTwo, data));
bSuccessfulOne = futureOne.get();
bSuccessfulTwo = futureTwo.get();

私が書いた最初の段落を考慮して、マルチスレッド/ジョブ並列フレームワーク/これらの Web サービス呼び出しを並列に処理するのに役立つかもしれない常識的なプログラミングがあります。もしあれば、提案してください。

4

2 に答える 2

0

順次実行は以下の行によるものです: bSuccessfulOne = futureOne.get(); bSuccessfulTwo = futureTwo.get();

将来のリストを作成してそこに結果を追加し、スレッドの実行を停止してください。awaitTermination などを使用できます。次に、リストから将来のオブジェクトを取得し、get 操作を行います。

于 2015-02-27T03:35:38.663 に答える
0

前のコメントで指摘したように、「シリアル化」される主な理由は 2 つあります。

  1. 非常に多くのリクエストが同時に到着する可能性がありますMyThread。実行中のスレッドの数が十分に少ない場合は、ジョブが次々に実行されることがあります。
  2. synchronizedあなたの のどこかにリソースがあるかもしれませんdata。両方のスレッドがそれらにアクセスできます。

しかし、なぜ両方のジョブを別のスレッドで実行しなければならないのか、私にはよくわかりません。あなたはこのようにすることができます:

ExecutorService executor = Executors.newFixedThreadPool(size);
Future<Boolean> futureOne = executor.submit(new MyThread(serviceOne, data));
Runnable jobTwo = new  MyThread(serviceTwo, data);
jobTwo.run();
bSuccessfulOne = futureOne.get();

このようにして、必要な の半分Threadの s がThreadPool得られます。これにより、確実にパフォーマンスが向上します。

元のバージョンに固執する場合は、測定することをお勧めします(つまり、ログなどで仮定を証明します)。

于 2013-02-08T15:54:03.767 に答える