2011-08-27 30 views
1

我是java.util.concurrent包的新手。我正在嘗試寫一些樣本。 這裏是我的一些示例代碼片段:Java併發性:如何異步獲得工作線程的響應

for (MyTask task : tasks) { 
Future<Boolean> result = task.getResult(); 
try { 
    if (result.isCancelled()) { 
     logger.info("processResults(): cancelled: "+ ((MyTask) task).getName()); 
    } else if (result.get() == false) { 
     logger.info("processResults(): Failed : "+ ((MyTask) task).getName()); 
    } else { 
     logger.info("processResults(): successful: "+ ((MyTask) task).getName()); 
     tasks.remove(task); 
     continue; 
    } 
} catch (Exception e) { 
    logger.warn("processResults(): Excepiton: " + e.getMessage()); 
} 
} 

我有一個關於從工作線程處理未來對象的一個​​問題。在我的循環中,任務的處理是按順序進行的;可以說,我需要處理來自工作線程的返回結果,如果我的第二個工作線程在第一個工作線程完成之前完成,在我的代碼中沒有辦法先處理第二個工作線程。

任何人都可以提出最好的方式來處理當前的threds。

感謝, Venkat Papana

回答

0

如果你想盡快完成一些工作,如任務完成後,你可以做到這一點在同一個線程。即將任務更改爲完成任何事情並在之後返回值完成所有事情。

+0

感謝@Peter Lawrey,可以說,我的每個線程都會返回一些結果,我需要累積每個工作線程的所有結果。我怎樣才能做到這一點? –

+0

閱讀我的答案,瞭解如何做到這一點。 – Bohemian

+0

您可以讓每個線程累積結果。但是,如果您想要簡單,請使用「未來」,因爲在最後一項任務完成之前無法完成。 –

3

這是使用生產者 - 消費者模式的經典案例:讓任務(生產者)將他們的結果放在隊列中,讓「下一步」代碼(消費者)從隊列中獲取結果並繼續工作。

ArrayBlockingQueue將是一個不錯的選擇。第二組工作線程在隊列塊上調用take(),直到有可用的東西(當第一步線程在隊列上調用put()時)。

1

問題聽起來爲java.util.concurrent.CompletionService

一個CompletionService的目的是分離的生產任務,從這些任務的結果的消耗量身定做。

結果消費者可以與任務生產者在同一個線程中,但它不一定是。