2017-02-20 67 views
0

如何使用Java 8的Fork/Join框架並行化循環。隨便我沒有使用多線程。我在SO中讀了很多問題。現在我無法在Java 8中實現並行處理列表。任何人都可以幫助我?如何使用Java 8的Fork/Join框架並行化循環

我曾嘗試過類似於this link的東西。

routes.stream().parallel().forEach(this::doSomething); 

情景就像基於路由列表名單,我需要devide任務並執行我需要一個像foreach循環的insted的我想基於陣列尺寸的並行執行。

我的問題是在處理updateSchedules服務時,它花費了太多時間。這就是我想在這裏實現線程概念的原因。 scheduleService.updateSchedules(originId, destinationId,req.getJourneyDate());

for (Availabilities ar : routes) { 
    try { 
    log.info("Starting for bus" + ar); 
    Bus bus = new Bus(); 

    // Get schedule list 
    BitlaSchedules schedule = scheduleRepo 
     .findByOriginIdAndDestinationIdAndScheduleIdAndTravelIdAndRouteId(originId, 
     destinationId, ar.getScheduleId(), ar.getTravelId(), ar.getRouteId()); 

    if (schedule == null) { 
     scheduleService.updateSchedules(originId, destinationId,req.getJourneyDate()); 
     schedule = scheduleRepo 
     .findByOriginIdAndDestinationIdAndScheduleIdAndTravelIdAndRouteId(originId, 
      destinationId, ar.getScheduleId(), ar.getTravelId(), ar.getRouteId()); 
    } 
    } catch(Exception e) { 
    log.error(e.getMessage()); 
    } 
} 
+0

我想用一個執行器會更合適。你是如何得出結論的?Fork/Join是你需要的嗎? – Fildor

+0

請編輯您的問題,以表明您嘗試了什麼(不僅僅是「某些事情來自...」)以及您遇到了什麼具體問題。如果這是一個編譯器錯誤,請複製/粘貼錯誤。如果是運行時錯誤,請執行相同的操作。如果這是意外的行爲,請描述它。 – slim

+0

請參閱:http://stackoverflow.com/help/mcve – slim

回答

1

正如@fdreger已經表示,它只會幫你CPU密集型任務。 因此,在做出任何假設之前,爲了獲得更好的表現,爲了獲得更好的表現,請爲自己做個忙。大多數情況下,瓶頸與IO相關。

我會給你一個很簡單的例子,你可以如何在Java使用並行流。

public class Test { 

    public static void main(String[] args) { 
     // some dummy data 
     List<Integer> list = new ArrayList<>(); 
     for (int i = 0; i < 20; ++i) list.add(i); 

     // to simulate some CPU intensive work 
     Random random = new SecureRandom(); 

     List<String> result = list.parallelStream().map(i -> { 

      // simulate work load 
      int millis = 0; 
      try { 
       millis = random.nextInt(1000); 
       Thread.sleep(millis); 
      } catch (InterruptedException e) { 
       Thread.currentThread().interrupt(); 
      } 

      // return any desired result 
      return "Done something with " + i + " in thread " + Thread.currentThread().getName() + " took " + millis + "ms"; 
     }).collect(Collectors.toList()); // collect joins - will return once all the workers are done 

     // print the result 
     result.forEach(System.out::println);  
    } 
} 
4

大概的基本錯誤是,你試圖做到這一點。

不要!該fork/join框架是工程的非常具體的一條 - 它解決了一個非常特殊的領域: - 解決CPU密集型問題; - 可以在不共享資源的情況下進行拆分(即無需同步或鎖定)。

你的代碼似乎使用外部服務: - 如果服務使用任何類型的數據庫,那麼你的問題不是CPU密集型的;即使不是,那麼 - 因爲有一個明顯的update,那麼就有一個需要同步的共享的可變狀態(尤其是因爲我們似乎有多個作者)。

這意味着您使用並行流不會獲得任何

只需使用一個標準的執行有一個線程池,並提交您的項目,如任務。

+0

@Sitansu任何最新的Java書籍都會解釋執行者,標準的Java教程或Google搜索到的數百個頁面也是如此。 – slim