자바 포크 조 인 트 프레임 의 원리 및 용법

이 글 은 주로 자바 ForkJoin 프레임 워 크 의 원리 와 용법 을 소개 하 였 으 며,예시 코드 를 통 해 매우 상세 하 게 소개 하 였 으 며,여러분 의 학습 이나 업무 에 대해 어느 정도 참고 학습 가 치 를 가지 고 있 으 므 로 필요 한 분 들 은 참고 하 시기 바 랍 니 다.
ForkJoin 분석
1.ForkJoin
포크 조 인 트 는 JDK 1.7 이후 다 중 동시 처리 프레임 워 크 를 제공한다.ForkJoin 의 틀 의 기본 사상 은 나 누 어 다스 리 는 것 이다.무엇이 나 누 어 다스 리 는 것 입 니까?나 누 어 처리 하 는 것 은 복잡 한 계산 을 설정 한 한도 값 에 따라 여러 개의 계산 으로 분해 한 다음 에 각 계산 결 과 를 종합 하 는 것 이다.그 에 상응하는 포크 조 인 트 는 복잡 한 계산 을 하나의 임무 로 삼 는 다.분해 한 여러 개의 계산 은 하나의 하위 임무 로 삼 는 다.

2.ForkJoin 의 사용
다음은 하나의 길 이 를 1 억 으로 계산 하 는 난수 정수 배열 을 예 로 들 어 ForkJoin 의 사용 을 보 여 드 리 겠 습 니 다.
1.창설 작업
ForkJoin 프레임 워 크 를 사용 하려 면 ForkJoin 의 작업 을 만들어 야 합 니 다.ForkJoin Task 는 추상 적 인 클래스 입 니 다.저 희 는 ForkJoin Task 를 계승 하여 사용 할 필요 가 없습니다.ForkJoin 프레임 워 크 는 RecursiveAction 과 RecursiveTask 를 제공 하기 때 문 입 니 다.우 리 는 포크 조 인 트 가 우리 에 게 제공 하 는 추상 적 인 유형 중 하 나 를 계승 하고 compute 방법 을 실현 해 야 한다.

private static class SumTask extends RecursiveTask<Integer>{

  //                        
  private final static int THRESHOLD = MakeArray.ARRAY_LENGTH/10;
  private int[] src; //            
  private int fromIndex;//       
  private int toIndex;//          

  public SumTask(int[] src, int fromIndex, int toIndex) {
    this.src = src;
    this.fromIndex = fromIndex;
    this.toIndex = toIndex;
  }

  @Override
  protected Integer compute() {
    //                    
    if(toIndex-fromIndex < THRESHOLD) {
      int count = 0;
      for(int i=fromIndex;i<=toIndex;i++) {
        count = count + src[i];
      }
      return count;
    }else {
      int mid = (fromIndex+toIndex)/2;
      SumTask left = new SumTask(src,fromIndex,mid);
      SumTask right = new SumTask(src,mid+1,toIndex);
      //       
      invokeAll(left,right);
      //      
      return left.join()+right.join();
    }
  }
}
2.ForkJoinPool 을 사용 하여 실행
task 는 ForkJoinPool 을 통 해 실 행 됩 니 다.분 단 된 하위 작업 도 현재 작업 스 레 드 의 양 끝 대기 열 에 추가 되 어 대기 열의 머리 에 들 어 갑 니 다.작업 스 레 드 에 작업 이 없 을 때 다른 작업 스 레 드 의 대기 열 끝 에서 작업 을 가 져 옵 니 다(작업 훔 치기).

public static void main(String[] args) {
  ForkJoinPool pool = new ForkJoinPool();
  int[] src = MakeArray.makeArray();
  SumTask innerFind = new SumTask(src,0,src.length-1);
  long start = System.currentTimeMillis();
  pool.invoke(innerFind);//    
}
3.ForkJoin 조심 하 세 요.
4.567917.ForkJoin 을 사용 하여 같은 계산 임 무 를 다 중 스 레 드 로 수행 합 니 다.데이터 의 계산 속 도 를 높 일 수 있다.구 글 의 빅 데이터 처리 프레임 워 크 인 Mapreduce 는 ForkJoin 과 유사 한 사상 을 통 해다 중 스 레 드 를 통 해 빅 데이터 의 처 리 를 높이다.그러나 우 리 는 주의해 야 한다.
4.567917.이러한 다 중 스 레 드 가 가 져 온 데이터 공유 문 제 를 사용 하고 결과 의 합병 을 처리 할 때 데이터 공유 문제 가 발생 하면 가능 한 한 JDK 가 제공 하 는 병렬 용 기 를 사용 합 니 다.
4.567917.ForkJoin 도 다 중 스 레 드 방식 으로 임 무 를 처리한다.그렇다면 포크 조 인 트 를 사용 해 야 할 지 말 아야 할 지 고민 할 수 밖 에 없다.데이터 양 이 그리 많 지 않 을 때,우 리 는 포크 조 인 트 를 사용 할 필요 가 없 기 때문이다.다 중 스 레 드 는 문맥 전환 과 관련 되 기 때문이다.그래서 데이터 양 이 많 지 않 을 때 직렬 을 사용 하 는 것 이 다 중 스 레 드 를 사용 하 는 것 보다 빠르다이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기