자바 에서 포크-join 의 원리 해석

4135 단어 자바forkjoin
포크 조 인 트 태 스 크 는 포크 조 인 트 풀 의 모든 미 션 입 니 다.그 는 주로 두 가지 종류 가 있 는데 그것 이 바로 Recursive Action 과 Recursive Task 이다.그리고 fork()방법 을 통 해 임 무 를 수행 하고 join()방법 으로 임 무 를 집계 합 니 다.

이것 이 바로 전체 과정의 운용 이다.그 는 두 개의 하위 클래스 가 있 는데,이 두 개의 하위 클래스 를 사용 하면 모두 우리 의 임무 분배 와 계산 을 실현 할 수 있다.
(1)RecursiveAction 결과 없 는 ForkJointask(반환 값 없 음)
(2)RecursiveTask 결과 가 있 는 ForkJointask(반환 값 이 있 음)
ForkJoinPool:workQueues 대기 열 이 포함 되 어 있 습 니 다.
work Queues:ForkJoinTask 배열 과 workerThread 와 ForkJoinPool 을 가리 키 는 참조 입 니 다.
ForkJoinTask 배열 은 프로그램 이 ForkJoinPool 에 제출 한 작업 을 저장 하고 workerThread 배열 은 이 작업 을 수행 합 니 다.ForkJoinPool 의 인용 은 ForkJoinTask 배열 의 작업 을 처리 한 후에 다시 작업 을 가 져 와 workerThread 에 맡 기기 위해 서 입 니 다.전체 구 조 는 대체적으로 다음 과 같다.

지식 포인트 확장:자바 병렬 포크-Join 프레임 원리 분석
1.Foirk/Join 프레임 워 크 가 무엇 입 니까?
포크/Join 프레임 워 크 는 자바 7 이 병행 작업 을 수행 하 는 프레임 워 크 로 큰 임 무 를 여러 개의 작은 임무 로 나 누 어 최종 적 으로 모든 작은 임무 결 과 를 모 아 큰 임무 결 과 를 얻 는 프레임 워 크 입 니 다.
2.병행 류 와 순서 류 는 무엇 입 니까?2.1 병행 류 는 무엇 입 니까?
병렬 흐름 은 하나의 내용 을 여러 개의 데이터 블록 으로 나 누고 서로 다른 스 레 드 로 각 데이터 블록 의 흐름 을 각각 처리 하 는 것 이다.
2.2 작업 절취 모드
어떤 스 레 드 가 다른 대기 열 에서 임 무 를 훔 쳐 서 수행 합 니 다.
3.포크/Join 프레임 워 크 사용

/**
 *        
 */
public class ForkJoinCalculate extends RecursiveTask<Long> {
 
    /**
     * 
     */
    private static final long serialVersionUID = 7125244951292834932L;
     
    private long start;//    
    private long end;//    
    private static final long THRESHOLD = 10000L;//    
 
    @Override
    protected Long compute() {
        long length = end - start;
         
        if(length <= THRESHOLD) {
            long sum = 0L;
             
            for (long i = start; i <= end; i++) {
                sum += i;
            }
             
            return sum;
        }else {
            long middle = (start + end) / 2;//    
             
            ForkJoinCalculate left = new ForkJoinCalculate(start, middle);// 0-50000000
            left.fork();//      ,        
            ForkJoinCalculate right = new ForkJoinCalculate(middle + 1, end);// 50000001-100000000
            right.fork();//      ,        
             
            return left.join() + right.join();//       
        }
    }
     
    public ForkJoinCalculate() {
    }
 
    public ForkJoinCalculate(long start, long end) {
        this.start = start;
        this.end = end;
    }
}
4.자바 8 의 병렬 흐름 과 순서 흐름
4.1 순차 흐름

/**
     * Java8    
     */
    @Test
    public void test3() {
        Instant start = Instant.now();// java8      API
         
        LongStream.rangeClosed(0, 10000000000L)
                    .sequential()//    
                    .reduce(0, Long::sum);
         
        Instant end = Instant.now();
         
        // 5780
        System.out.println("     :" + Duration.between(start, end).toMillis());// java8      API
    }
4.2 보행 흐름

/**
     * Java8    
     */
    @Test
    public void test4() {
        Instant start = Instant.now();// java8      API
         
        LongStream.rangeClosed(0, 10000000000L)
                    .parallel()//    
                    .reduce(0, Long::sum);
         
        Instant end = Instant.now();
         
        // 2392
        System.out.println("     :" + Duration.between(start, end).toMillis());// java8      API
    }
자바 의 fork-join 원리 해석 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.자바 의 fork-join 원리 에 관 한 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기