2017-05-23 8 views
0

배송 물품 목록이 있으며 각 발송물에 대한 정보를 얻기 위해 API 호출을해야합니다. 이 네트워크 호출을 병렬로 만들려고합니다. 그래서 자바 8 parallelStream() 사용하여 다음과 같이 정의 ForkJoinPool에 제출하고 있습니다 : 내 ForkJoinPool에서 스레드의 수를 최적화 할맞춤 ForkJoinPool에 제출 된 요청이 즉시 처리되는지 확인합니다.

  1. , 그래서 I :

    @Autowired 
    ForkJoinPool forkJoinPool; 
    ... 
    public void someMethod(){ 
        ... 
        List<MyObj> myObjList = null; 
        try { 
         myObjList = forkJoinPool.submit(() -> shipmentList.parallelStream() 
          .map(shipment -> getShipmentInfo(shipment)) 
          .collect(Collectors.toList()) 
          ).get(); 
         } catch (Exception e){ 
          ... 
         } 
    } 
    
    public MyObj getShipmentInfo(Shipment shipment) { 
        // Make network call and return MyObj 
    } 
    

    나는이 개 질문이 어떻게 수행하고 있는지 확인해야합니다. 요청이 처리되지 않고 풀에서 즉시 처리되는 경우 기록 할 수 있습니까?

  2. 내 시스템에 많은 트래픽이 발생합니다. 따라서 autowired ForkJoinPoolsubmit()get()을 입력하면 다른 요청으로 발송물을 기다려야합니까? 제가 말하고자하는 것은 2 가지 요청을 동시에 처리 할 수 ​​있습니다. Request1에는 3 개의 발송물이 있고 Request2에는 5 개의 발송물이 있습니다. 그래서 위의 코드는 8 개의 선적이 완료 될 때까지 기다릴 것입니까?

감사합니다.

답변

0

내 ForkJoinPool에서 스레드 수를 최적화하고 싶으므로 어떻게 수행하는지 확인해야합니다. 요청이 처리되지 않고 풀에서 즉시 처리되는 경우 기록 할 수 있습니까?

제출 큐가 ForkJoinPool.hasQueuedSubmissions()을 통해 비어 있지 않은지 사전에 확인할 수 있습니다. 따라서 true를 반환하면 요청이 처리되지 않고 즉시 처리됩니다. 대기열 크기가 0보다 작 으면 ForkJoinPool.getQueuedSubmissionCount()으로 다시 확인할 수 있습니다 (대기열에있는 제출의 수가 n 인 경우 O (n) 시간 복잡성이 있음).

내 시스템에 많은 트래픽이 발생합니다. 따라서 autowired ForkJoinPool에서 submit() 및 get()을 수행하면 다른 요청에서 발송물을 기다려서 코드를 작성하게됩니까? 제가 말하고자하는 것은 2 가지 요청을 동시에 처리 할 수 ​​있습니다. Request1에는 3 개의 발송물이 있고 Request2에는 5 개의 발송물이 있습니다. 그래서 위의 코드는 8 개의 선적이 완료 될 때까지 기다릴 것입니까?

예, 배송은 8 회까지 완료됩니다. 풀 및 대기열 크기에 따라 최상의 경우에는 가장 긴 발송 처리 시간이 소요되는 시간과 거의 같습니다.