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だけ、それによって効率を向上させ、複数のキューを通じて競争を減らすために、スレッドのキューを保持し、複数のキューを維持します。