我使用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