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、
            ヌルtrueに); 
    @Autowired 
    プライベートRestTemplate RestTemplate; 

    / ** 
     *複数のシステムからのクエリデータが返さ合成
     * / 
    パブリックオブジェクトgetUserInfo(文字列USERID)スロー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 = END; 
    } 

    //は、実際に実行されますメソッドのエントリ(タスク分割)
    @Overrideが
     保護さJSONObject計算(){
         int型の COUNT =終了-開始し; //は、多くのデータ処理を必要とし、現在のタスクを表し
         @ 分割するかどうかのシーンは、大きな課題であるかどうかを判断するサービスに応じて自分自身
        IF(COUNT == 0 ){
            URL文字列 = urls.get(スタート);
             // TODO、すぐに呼び出す1つのインターフェイスだけ呼び出した場合に
            ロング 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();
             // 端に+1の中間値、からタスク。
            HttpJsonRequest1 = HttpJsonRequest 新しい新 HttpJsonRequest(RestTemplate、URLを、X- + 1、エンド); //は?どの取引の一部を担当する
            HttpJsonRequest1.fork(); 

            // 処理結果が参加します 
            JSONObject結果= 新しい新しいJSONObjectを();
            
            // 结果合并参加。
            result.putAll(httpJsonRequest.join()); 
            result.putAll(httpJsonRequest1.join())。
            
            戻り値の結果; 
        } 
    } 
}

タスクが実行するスレッドプールを分割して、マージすることです。戻り値多少似て未来をキャプチャします。ただ、タスク分割抽象パッケージを実行します。

 

特徴:

ThreadPoolExecutorは、スレッドプールは、キューを維持します。実行するタスクキューのために競争するためにマルチスレッド。

 

ForkJoinPoolは、すべての大きな課題は、小さなタスクがそのキューに分割されてフォーク、キューを維持することです。スレッドがこの時点でキューに自分のタスクを処理するために、どのスレッドの競争は、効率がスレッドプールよりも高いではありません。

独自のキュー・プロセスに現在のスレッドが行くと他のタスクのキューを処理するために、他のスレッドを競う、終わって、この用語は盗む仕事と呼ばれています。

 

ForkJoinPoolはThreadPoolExecutorだけ、それによって効率を向上させ、複数のキューを通じて競争を減らすために、スレッドのキューを保持し、複数のキューを維持します。

おすすめ

転載: www.cnblogs.com/itbac/p/11297013.html