我正在使用 Callable、Executor 和 Future 对象从单独的线程并行调用 web 服务。执行完所有 web 服务调用后,我在 jsp 中显示结果。
在这里我有一个疑问:如果其中一个 web 服务调用失败,如何在 jsp 中显示成功调用的结果?
如果在这种情况下一个线程需要更多时间来执行,我想跳过该响应并在 jsp 中显示其余结果。
我试图在一个网络服务中添加一个Thread.sleep(1000)
,但响应在 jsp 中也有延迟。
我正在使用 Callable、Executor 和 Future 对象从单独的线程并行调用 web 服务。执行完所有 web 服务调用后,我在 jsp 中显示结果。
在这里我有一个疑问:如果其中一个 web 服务调用失败,如何在 jsp 中显示成功调用的结果?
如果在这种情况下一个线程需要更多时间来执行,我想跳过该响应并在 jsp 中显示其余结果。
我试图在一个网络服务中添加一个Thread.sleep(1000)
,但响应在 jsp 中也有延迟。
您可能需要在启动所有其他线程的主线程中考虑CountdownLatch。
这个想法是,在你产生所有线程之后,你开始在给定超时的闩锁上等待。每个线程在完成时都必须调用countDown()
闩锁上的方法。因此,当所有线程都完成或超时已过期时,主线程将继续进行。
有人发布了这个并删除了他的答案,但我认为这可能会有所帮助。
您可以使用ExecutorCompletionService
您可以简单地提交到 ExecutorService 并准备好在poll
ExecutorService 上呈现。它会给你最近完成的未来,或者坐在那里等到一个准备好。
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
}
应该考虑您的用例。
如果您使用的是执行器服务,您可以在提交所有可调用对象后通过超时终止它:
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"); }
}
}