Java執行緒池ForkJoinPool例項解析
阿新 • • 發佈:2020-02-05
這篇文章主要介紹了Java執行緒池ForkJoinPool例項解析,文中通過示例程式碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
背景:ForkJoinPool的優勢在於,可以充分利用多cpu,多核cpu的優勢,把一個任務拆分成多個“小任務”,把多個“小任務”放到多個處理器核心上並行執行;當多個“小任務”執行完成之後,再將這些執行結果合併起來即可。這種思想值得學習。
import java.io.IOException; import java.util.Arrays; import java.util.Random; import java.util.concurrent.RecursiveAction; import java.util.concurrent.RecursiveTask; /** * 分割 合併 執行緒池 * 類似於遞迴的歸併排序,這個是多執行緒的遞迴排序 * jdk1.7之後加的 */ public class ForkJoinPool { static int[] nums = new int[1000000]; static final int MAX_NUM = 50000; static Random random = new Random(); static { for(int i=0; i<nums.length; i++) { nums[i] = random.nextInt(100); } System.out.println("總和1:" + Arrays.stream(nums).sum()); } /** * ForkJoinPool裡面必須是ForkJoinTask, * 直接繼承ForkJoinTask類寫起來比較麻煩, * 可以繼承RecursiveAction(無返回值)和RecursiveTask(遞迴任務,有返回值) */ // static class AddTask extends RecursiveAction { // // int start,end; // // public AddTask(int start,int end) { // this.start = start; // this.end = end; // } // // @Override // protected void compute() { // if(end-start <= MAX_NUM) { // long sum = 0L; // for(int i=start; i<end; i++) sum += nums[i]; // System.out.println("from:" + start + " to:" + end + " =" + sum); // }else{ // int middle = start + (end - start) / 2; // // AddTask subTask1 = new AddTask(start,middle); // AddTask subTask2 = new AddTask(middle,end); // subTask1.fork(); // subTask2.fork(); // } // } // } /** * 有返回值 */ static class AddTask extends RecursiveTask<Long> { int start,end; public AddTask(int start,int end) { this.start = start; this.end = end; } @Override protected Long compute() { if(end-start <= MAX_NUM) { long sum = 0L; for(int i=start; i<end; i++) sum += nums[i]; System.out.println("from:" + start + " to:" + end + " =" + sum); return sum; } int middle = start + (end - start) / 2; AddTask subTask1 = new AddTask(start,middle); AddTask subTask2 = new AddTask(middle,end); subTask1.fork(); subTask2.fork(); return subTask1.join() + subTask2.join(); } } public static void main(String[] args) { java.util.concurrent.ForkJoinPool pool = new java.util.concurrent.ForkJoinPool(); AddTask task = new AddTask(0,nums.length); pool.execute(task); //精靈執行緒 System.out.println("總和2:" + task.join()); try { System.in.read(); //阻塞主執行緒 } catch (IOException e) { e.printStackTrace(); } } }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。