0

java.util.concurrentパッケージを使用して並列プログラムを作成しています。私は2つのスレッドを持っています:

  • Webサービスmethod-1を呼び出すthread-1、および
  • Webサービスメソッド2を呼び出すthread-2。

スレッド実行タイムアウトを指定しています-スレッド1が指定されたタイムアウト内に実行を完了しない場合、スレッド1をインターセプトし、スレッド2で実行を続行し、スレッド2の結果をjspで表示する必要があるとします(注:両方の場合スレッドはリクエストの処理に時間がかかりすぎるため、UIが完了するまで待機したくありません)。

以下のコードで試しましたが、InterruptedExceptionがスローされます。1つのタスクがより多くのマイアを必要とする場合、どうすれば他のタスクを進めることができますか?

ExecutorService executor = Executors.newFixedThreadPool(2);
CompletionService<ArrayList<AvailableWeatherDetailVO>> compService =   new ExecutorCompletionService<ArrayList<AvailableWeatherDetailVO>>(executor);
// Start amazonTask using thread-1
try{
   compService.submit(amazonTask).get(20, TimeUnit.MILLISECONDS);
   amazonFuture = compService.take();
  amazonFinalList =(ArrayList<AvailableWeatherDetailVO>)amazonFuture .get()                 }
catch (TimeoutException e) {
  compService.submit(amazonTask).cancel(true);
  //throw new TimeoutException("Thread not executed with in speifed time");
 }
// Start googleTask using thread-2
try{
   compService.submit(googleTask).get(100, TimeUnit.MILLISECONDS);
   googleFuture = compService.take();
  googleFinalList =(ArrayList<AvailableWeatherDetailVO>)googleFuture .get()                 }
catch (TimeoutException e) {
  compService.submit(googleTask).cancel(true);
  //throw new TimeoutException("Thread not executed with in speifed time");
 }
4

1 に答える 1

0

スレッド1が失敗した場合にのみスレッド2が実行を開始するという意味かどうかは明確ではありません。

または、両方とも実行中ですが、完了した場合はスレッド 1 の結果を使用し、それ以外の場合はスレッド 2 の結果を使用します。

スレッド 1 を Future にアタッチする必要があるように思えます。次に、タイムアウトで(メインスレッドから)結果を取得します。Future.get() がタイムアウトした場合は、2 番目のスレッドから結果を取得します。

私があなたの意味を理解したかどうかはわかりません。これがあなたが探しているものでない場合は、明確にしてください。

于 2012-07-08T22:24:43.973 に答える