2012-07-02 76 views
0

我使用Callable,Executor和Future對象從不同的線程並行地調用webservices。執行完所有的web服務調用後,我將結果顯示在jsp中。如何在併發java編程中指定線程執行?

這裏我有一個疑問:如果其中一個web服務調用失敗,我該如何顯示jsp中成功調用的結果?

如果一個線程在這種情況下需要更多時間來執行,我想跳過這個響應並在jsp中顯示其餘的結果。

我試圖在一個webserice中添加一個Thread.sleep(1000),但響應也延遲了jsp。

回答

0

如果您使用的是執行的服務,您可以用超時已經提交了所有你可調用後終止它:

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

@JohnVint任何你刪除你的答案的原因是什麼? – assylias

+0

嗨assylias是我必須寫performter.shutdown()後上面的代碼。如果是在excute.shotdown之前,我正在提交我的任務,它會拖延更多時間我的問題是,如果它需要超過60秒,我該如何取消該任務? – rev

+0

是:調用shutdown&awaitTermination,如果終止是真的,一切都完成了,如果沒有,你仍然有一些任務在運行。然後,您可以瀏覽期貨並調用'future.cancel(true)'來取消仍在運行的任務。或者,您可以在awaitTermination後調用'executor.shutdownNow()'來取消所有仍在運行的任務。執行.shutdown之後 – assylias

2

您可能要考慮啓動所有其他線程的主線程中的CountdownLatch

這個想法是,當你產卵所有線程後,你開始在給定的超時時間等待鎖存器。每個線程完成後,都必須在鎖存器上調用countDown()方法。因此,當所有線程完成或超時已到期時,主線程將繼續進行。

0

有人發佈此消息並刪除了他的答案,但我認爲這可能會有所幫助。


您可以使用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 
} 

應該考慮你的使用情況。