2017-02-20 7 views
0

Java 8의 Fork/Join 프레임 워크로 루프를 병렬화하는 방법. 정확하게 여러 스레딩에서 작동하지 않았습니다. 나는 많은 질문을 읽었습니다. 이제 Java 8에서 병렬 처리를 구현할 수 없습니다. 어느 누구도 나를 도울 수 있습니까?Java 8의 Fork/Join 프레임 워크로 루프를 병렬화하는 방법

나는 같은 것을 시도했다 this link.

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

시나리오 경로의 목록을 기반으로 목록처럼 나는 작업으로 나눔과 내가 배열의 크기에 따라 병렬 실행을 원하는 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

나는 Executor를 사용하는 것이 더 적절하다고 생각합니다. 결론에 어떻게 왔습니까? Fork/Join은 필요한 것입니다. – Fildor

+0

"some things from ..."뿐만 아니라 어떤 시도를했는지, 그리고 어떤 문제가 발생했는지 나타 내기 위해 질문을 편집하십시오. 컴파일러 오류 인 경우 오류를 복사/붙여 넣기하십시오. 런타임 오류 인 경우 동일한 작업을 수행하십시오. 예상치 못한 동작 인 경우 설명하십시오. – 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

아마도 기본 오류는 수행하려고 시도한 것입니다.

하지 마! 포크/조인 프레임 워크는 매우 특정 엔지니어링 - 매우 특정한 영역을 해결합니다 : - CPU 집중 문제 해결; - 리소스를 공유하지 않고 분할 할 수 있습니다 (즉, 동기화 또는 잠금 없음).

코드가 외부 서비스를 사용하는 것으로 보입니다. - 서비스가 모든 종류의 데이터베이스를 사용하는 경우 문제가 CPU를 많이 사용하지 않습니다. - 분명하지 않은 경우에도 - update이 있으므로 동기화가 필요한 공유 가능 상태 (특히 여러 작성자가있는 것 같음)가 있습니다.

즉, 은 병렬 스트림을 사용하여을 얻지 못합니다.

스레드 풀과 함께 표준 실행 프로그램을 사용하고 항목을 작업으로 제출하십시오.

+0

@Sitansu 최신 자바 서적에는 표준 Java 자습서 또는 인터넷 검색으로 찾을 수있는 수백 페이지와 같이 집행자가 설명되어 있습니다. – slim