0

我正在使用 java.util.concurrent 包来创建一个并行程序。我有 2 个线程:

  • 调用 webservice 方法 1 的线程 1,以及
  • 调用 webservice 方法 2 的线程 2。

我正在指定线程执行超时 - 假设如果线程 1 没有在指定的超时时间内完成执行,那么我必须拦截线程 1,继续使用线程 2 执行并在 jsp 中显示线程 2 结果(注意:如果两者线程需要太多时间来处理请求,然后我不希望 UI 等到它们完成)。

我尝试使用下面的代码,但它抛出了一个 InterruptedException。当一项任务陷入更多泥潭时,我该如何继续执行其他任务?

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

目前尚不清楚您的意思是 thread2 仅在 thread1 失败时才开始执行。

或者,它们是否都在执行,但是如果它完成,你想使用 thread1 的结果,否则你想使用 thread2 的结果

在我看来,您应该将线程 1 附加到 Future。然后通过超时获取结果(从您的主线程)。如果 Future.get() 超时,则从第二个线程获取结果。

不知道我是否明白你的意思。如果这不是您要查找的内容,请澄清。

于 2012-07-08T22:24:43.973 回答