ForkJoinPool는 멀티 스레드 분할 작업을 사용하여 작업, 합병의 결과를 수행 할 수 있습니다.

ForkJoinPool 더그 레아 구현 재귀 호출 작업 분할, 병합, 스레드 풀에 의해 작성 jdk1.7입니다.

코드 예 :

패키지 www.itbac.com, 

가져 오기 com.alibaba.fastjson.JSONObject,
 가져 오기 org.springframework.beans.factory.annotation.Autowired,
 가져 오기 org.springframework.stereotype.Service,
 가져 오기 org.springframework.web.client.RestTemplate; 

가져 오기 인 java.util.ArrayList;
 가져 오기 있는 java.util.concurrent. * ; 

/ ** 
 * 병렬 인터페이스 HTTP 호출 
 * / 
@Service 
공공  클래스 UserServiceForkJoin {
     // 기본적으로 스레드 풀 스레드의 기본 번호 :의 CPU 코어의 수 
    ForkJoinPool forkJoinPool = 새로운 새 ForkJoinPool (10 , ForkJoinPool.defaultForkJoinWorkerThreadFactory,
            널 (null) , true로 ) 
    @Autowired 
    개인 RestTemplate RestTemplate; 

    / ** 
     * 여러 시스템에서 쿼리 데이터가 반환 합친 
     * / 
    공공 오브젝트 getUserInfo (문자열 사용자 ID) 가 발생 ExecutionException, 예외 : InterruptedException는 {
         // 또 다른 예를 들어, 데이터베이스의 체크 테이블 데이터의 복수 여러 쿼리에서
         // 포크가 / 참가
         // forkJoinPool.submit () 
        ArrayList의 <문자열> URL을 = 새로운 새로운 ArrayList를 <> (); 
        urls.add ( "http://www.itbac.com/userinfo-api/get ? userId를 = "+ userId를) 
        urls.add ( "http://www.itbac.com/integral-api/get?userId= "+ userId를);

        HttpJsonRequest httpJsonRequest = 새로운 HttpJsonRequest (restTemplate, URL을 0 urls.size () - 1 ); 
        ForkJoinTask <된 JSONObject> forkJoinTask = forkJoinPool.submit (httpJsonRequest); 

        된 JSONObject 결과 = forkJoinTask.get ();
        반환 결과를; 
    } 
} 

// 自定义任务类,继承递归任务. 
클래스 HttpJsonRequest이 연장 RecursiveTask를 <된 JSONObject> { 

    RestTemplate restTemplate; 
    ArrayList를 <문자열> URL을;
    INT 시작;
    INT의 끝;

    HttpJsonRequest (RestTemplate RestTemplate, ArrayList의 <문자열> URL이, int로 시작 INT의 끝) {
         다음은이 .restTemplate = RestTemplate;
         은이가 =의 .urls URL을,
         다음은이 .start = 시작,
         다음은이 .END이 = 끝이; 
    } 

    // 사실에 수행 방법 항목 (작업 분할)을 
    @Override는
     보호 된 JSONObject 계산 () {
         INT의 , 시작 - COUNT는 = 끝 //이 많은 데이터 처리를 필요로 현재 작업 나타냅니다
         @ 분할 여부, 장면이 큰 작업인지 여부를 판단하는 서비스에 따라 스스로를 
        IF (COUNT == 0 ) {
            URL 문자열= Urls.get (시작);
             // TODO 하나의 인터페이스를 호출하는 경우, 즉시 전화 
             userinfoTime = )에 System.currentTimeMillis을 (; 
            문자열 응답 = restTemplate.getForObject (URL, 문자열. 클래스 ) 
            된 JSONObject 값 = JSONObject.parseObject (응답 ) 
            에서 System.out.println (는 Thread.currentThread는 () + + (에 System.currentTimeMillis () - userinfoTime) "인터페이스 호출 완료"+ "#"+ URL);
             반환 값; 
        } 다른 { // 만약 복수의 인터페이스 하위 7, 8, 9로 분할, 전화 (10)가
            에서 System.out.println (는 Thread.currentThread () + "작업 나누기 시간" );
             // 중간 형성. 
            INT X = (시작, 종료 +) / 2 ]
             // 중간 값이 처음부터 작업. 
            HttpJsonRequest = HttpJsonRequest 새로운 새로운 HttpJsonRequest (RestTemplate, URL을 시작, X 축); // ? 어느 부분에 대한 책임
             // 포크 분할 작업. 
            httpJsonRequest.fork ();
             // 끝에 하나의 중간 값에서 태스크. 
            HttpJsonRequest1 = HttpJsonRequest 새로운 새로운 HttpJsonRequest (RestTemplate, URL을, X 축 + 1, 끝); // ? 책임있는 거래의 부분 
            , HttpJsonRequest1.fork () 

            // 얻을 치료 결과에 가입 
            = 된 JSONObject에게 결과를 새 새 () 된 JSONObject를;
            
            // 结果合并가입 할 수 있습니다. 
            result.putAll (httpJsonRequest.join ()); 
            result.putAll (httpJsonRequest1.join ()); 
            
            반환 결과를; 
        } 
    } 
}

이 작업은 실행 한 다음 병합 할 스레드 풀을 분할하는 것입니다. 그리고 반환 값 미래가 다소 유사한 캡처합니다. 그냥 작업 나누기 추상적 인 패키지를 않습니다.

 

특징 :

ThreadPoolExecutor입니다 만 스레드 풀 큐를 유지한다. 태스크 큐 실행하는 멀티 스레딩은 경쟁합니다.

 

ForkJoinPool 모든 큰 작업은 큐를 유지 작은 작업이 자신의 큐에 분할 밖으로 포크 것입니다. 스레드가이 시간에 대기열에 자신의 작업을 처리하기 위해, 더 스레드 경쟁, 효율은 스레드 풀보다 높은 없습니다.

자신의 큐 과정에 대한 현재의 thread 가서 다른 작업 큐를 처리하는 다른 스레드 경쟁, 이상하다,이 용어는 훔치는 일이라고합니다.

 

ForkJoinPool는 ThreadPoolExecutor입니다 만하여 효율성을 향상, 다중 큐를 통해 경쟁을 줄이기 위해 스레드의 큐를 유지하고, 다중 큐를 유지한다.

추천

출처www.cnblogs.com/itbac/p/11297013.html