2017-06-20 60 views
0

一個電話,我有以下代碼:並行化在Java

List<ObjectA> allObjects = (List<ObjectA>) objArepository.findAll(); 

for (ObjectA objA : allObjects) { 
     String location = objA.getUrl(); 

     Client client = utils.createClient(); 
     WebTarget webTarget = client.target(location).path("/testUrl/" + someString); 
     Invocation.Builder requestBuilder = webTarget.request(); 
     Response response; 
     try { 
      response = request.invoke(); 
      } 
     } 

,而不是用於環路串行發送這些電話,我想所有的平行發送這些呼叫,問題是,我沒」找到任何例子,我想念一個想法如何在java中做到這一點

+0

只是一個建議 - Apache Spark是一款優秀的並行計算開源工具。這是值得你花時間來看看,但這取決於你。 – Peri461

+0

多線程將是這裏的簡單答案。但是,這取決於請求的數量,如果沒有限制,您應該使用池線程來限制請求的數量,否則您會使接收請求的服務器超載。請注意,我寧願使用回調方法,而不使用多線程系統,但這需要更多工作 – AxelH

回答

1

使用ExecutorService

executorService.invokeAll可以並行執行任務列表並等待它們完成。

ExecutorService executor = getExecutorService(); 
List<Request> requests = getRequests(); 
List<Callable> tasks = requests.stream() 
    .map(r -> new Processor(r)) 
    .collect(Collectors.toList()); 

executor.invokeAll(tasks); 

如果需要異步調用,使用executorService.submitexecutorService.execute

更新

按照評論,添加對上面的代碼幾句話。

getExecutorServices()返回在其他地方創建的executorService,可能是單身人士,因爲創建executorService非常昂貴。

getRequests()返回請求列表,Request可以是您想要處理的任何內容,例如ObjectA

executorService.invokeAll接受Callable的列表,因此您必須將您的請求封裝在可調參數中。 Processor是一個可調用來處理Request

實際上,我認爲代碼是相當具有描述性的,一個普通的Java程序員可以理解它。

+0

您的回答很難理解,因爲它引用了未知代碼。 getExecutorService()做什麼來獲得ExecutorService?什麼是Request,什麼是getRequests()?什麼是「處理器」? – VGR

+0

明天我會試試看,當它工作時我會給你正確的答案:)感謝迄今爲止的幫助 – Nali