我使用Callable,Executor和Future对象从不同的线程并行地调用webservices。执行完所有的web服务调用后,我将结果显示在jsp中。如何在并发java编程中指定线程执行?
这里我有一个疑问:如果其中一个web服务调用失败,我该如何显示jsp中成功调用的结果?
如果一个线程在这种情况下需要更多时间来执行,我想跳过这个响应并在jsp中显示其余的结果。
我试图在一个webserice中添加一个Thread.sleep(1000)
,但响应也延迟了jsp。
我使用Callable,Executor和Future对象从不同的线程并行地调用webservices。执行完所有的web服务调用后,我将结果显示在jsp中。如何在并发java编程中指定线程执行?
这里我有一个疑问:如果其中一个web服务调用失败,我该如何显示jsp中成功调用的结果?
如果一个线程在这种情况下需要更多时间来执行,我想跳过这个响应并在jsp中显示其余的结果。
我试图在一个webserice中添加一个Thread.sleep(1000)
,但响应也延迟了jsp。
如果您使用的是执行的服务,您可以用超时已经提交了所有你可调用后终止它:
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"); }
}
}
您可能要考虑启动所有其他线程的主线程中的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
}
应该考虑你的使用情况。
@JohnVint任何你删除你的答案的原因是什么? – assylias
嗨assylias是我必须写performter.shutdown()后上面的代码。如果是在excute.shotdown之前,我正在提交我的任务,它会拖延更多时间我的问题是,如果它需要超过60秒,我该如何取消该任务? – rev
是:调用shutdown&awaitTermination,如果终止是真的,一切都完成了,如果没有,你仍然有一些任务在运行。然后,您可以浏览期货并调用'future.cancel(true)'来取消仍在运行的任务。或者,您可以在awaitTermination后调用'executor.shutdownNow()'来取消所有仍在运行的任务。执行.shutdown之后 – assylias