0

Callable、Executor、Futureオブジェクトを使用して、別々のスレッドから並列にWebサービスを呼び出しています。すべてのWebサービス呼び出しを実行した後、結果をjspで表示します。

ここで疑問があります。Webサービス呼び出しの1つが失敗した場合、jspで成功した呼び出しの結果をどのように表示できますか?

そのような状況で1つのスレッドの実行に時間がかかる場合は、その応答をスキップして、残りの結果をjspで表示したいと思います。

Thread.sleep(1000)1つのwebsericeにを追加しようとしましたが、jspでも応答が遅れます。

4

3 に答える 3

2

他のすべてのスレッドを開始するメインスレッドでCountdownLatchを検討することをお勧めします。

すべてのスレッドを生成した後、指定されたタイムアウトでラッチの待機を開始するという考え方です。各スレッドは、終了時countDown()に、ラッチのメソッドを呼び出す必要があります。したがって、メインスレッドは、すべてのスレッドが完了するか、タイムアウトが経過すると続行されます。

于 2012-07-02T16:36:54.317 に答える
0

エグゼキュータサービスを使用している場合は、すべての呼び出し可能オブジェクトを送信した後、タイムアウトでサービスを終了できます。

executor.shutdown();
boolean terminated = executor.awaitTermination(1, TimeUnit.SECONDS);

また、ジョブの送信時にエグゼキュータから返された先物を保存している場合は、リストをループして、完了していないタスクを確認できます。

if (!terminated) {
    for (Future f : futureList) {
        if (!f.isDone()) { System.out.println("This task " + f + " did not complete"); }
    }
}
于 2012-07-02T16:49:14.363 に答える
0

誰かがこれを投稿して彼の答えを削除しましたが、私はそれが役立つかもしれないと思いました。


ExecutorCompletionServiceを使用できます

ExecutorServiceに送信するだけで、ExecutorServiceでレンダリングする準備ができたらpoll。それはあなたに最近完成した未来を与えるか、そこに座って準備ができるまで待ちます。

ExecutorCompletionService e = new ExecutorCompletionService(...);

for(int i =0; i < n ; i++)
    e.submit(..);

準備ができている間

for(int i =0 ; i < n; i++){
   T t = e.poll(); //or with a timeout: T t = e.poll(100, TimeUnit.MILLISECONDS); 
   //do rendering
}

ユースケースを説明する必要があります。

于 2012-07-02T18:17:19.097 に答える