如何在并发java编程中指定线程执行?

时间:2012-07-02 16:26:07

标签: java jsp java.util.concurrent

我使用Callable,Executor和Future对象从不同的线程并行调用webservices。执行完所有的webservice调用后,我在jsp中显示结果。

我有一个疑问:如果其中一个webservice调用失败,我怎样才能显示jsp成功调用的结果?

如果一个线程在这种情况下需要更多时间来执行,我想跳过该响应并在jsp中显示其余结果。

我尝试在一个网络服务器中添加Thread.sleep(1000)但是jsp中的响应也被延迟了。

3 个答案:

答案 0 :(得分:2)

您可能需要在启动所有其他线程的主线程中考虑CountdownLatch

我们的想法是,在您生成所有线程之后,您会在给定超时的情况下开始等待锁存器。每个线程完成后,都必须在锁存器上调用countDown()方法。因此,当所有线程完成或超时已到期时,主线程将继续。

答案 1 :(得分:0)

如果您正在使用执行程序服务,则可以在提交所有可用的callables后超时终止它:

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"); }
    }
}

答案 2 :(得分: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
}

应考虑您的使用案例。