2017-04-06 9 views
6

내가 병렬 N 정도와 ForkJoinPool 설정을했다고 가정하고,이 같은 병렬 연산 부르는 :ForkJoinPool 및하는 Future.get

workpool.submit(
      () -> { 
        objects.values().parallelStream().forEach(obj -> { 
         obj.foo(); 
        }); 
       }); 

I는 스레드가 생성되는 산란되도록 이렇게 작업 풀 내부 (격리해야하는 시스템의 여러 구성 요소가 있음). 이제이 호출되는 스레드가,이 workpool 내에서 실행되고 있다고 가정하고, 내가 할 :

Future<?> wait = workpool.submit(
      () -> { 
        objects.values().parallelStream().forEach(obj -> { 
         obj.foo(); 
        }); 
       }); 
wait.get() 

1) 나는 ForkJoinPool에서 스레드를 차단하고 있습니까? n 개의 스레드를 모두 미래에 띄워 놓고 작업 풀에서 작업을 예약하려고하면 교착 상태가 발생합니까? ForkJoinPool의 "최대 평행도 (parallellism)"가 (차단되지 않은 작업이 n 개가있는 경우) n 개의 스레드가 항상 실행되는지 또는 고정 된 수의 스레드가 있는지 여부와 상관없이 차단되었습니다. wait.join 대신에 wait.join()을 사용하면 (이 코드에서 던져진 예외가 이미 런타임 예외를 생성 할 것이므로 확인 된 예외가 필요하지 않습니다.) 올바르게 이해하면 join()은 대기 중에 대기중인 작업을 실행하는 스레드가 스레드를 허용 함)

2) 나는 실행 가능한 "래퍼"클래스를 생성하고 있다면 난 여전히()을 수행하여 병렬 스트림의 작업 forkjoin 경량의 이익을 얻고있다 -

3) {}가>가 어떤 아래쪽/위쪽을 대신 사용하십시오. (.join()이 실제로 그렇게 생각하는 작업 도용 동작을 실제로 구현한다고 가정)

답변

1

포인트 1에 대한 응답 : 실제 메소드 구현을 보지 않고 코드가 차단되는지 여부를 알기가 어렵습니다. 블로킹 코드를 다루는 한 가지 방법은 forkjoin 스레드 풀의 스레드 수를 늘리는 것입니다. 일반적으로 forkjoin 스레드의 스레드 수는 계산 집약형 작업의 경우 n + 1이며 n = 프로세서 수입니다. 또는 I/O 차단이있는 경우 ManagedBlocker를 사용할 수 있습니다.

응답이 가리 : 점 3

응답 : 당신의 completableFuture 코드에 명백한 상승은 thenAccept 비 블로킹 것입니다. 따라서 컨트롤은 즉시 CompletableFuture 블록을 지나서 다음 문장으로 넘어갈 것입니다. 이전 코드에서는 ForkJoin 풀을 사용하여 작성했지만 wait.get()은 응답을 얻을 때까지 차단되어 그때까지 진행되지 않습니다.