내가 병렬 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()이 실제로 그렇게 생각하는 작업 도용 동작을 실제로 구현한다고 가정)