Java線程池ForkJoinPool實例解析
這篇文章主要介紹了Java線程池ForkJoinPool實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
背景:ForkJoinPool的優(yōu)勢在于,可以充分利用多cpu,多核cpu的優(yōu)勢,把一個任務拆分成多個“小任務”,把多個“小任務”放到多個處理器核心上并行執(zhí)行;當多個“小任務”執(zhí)行完成之后,再將這些執(zhí)行結(jié)果合并起來即可。這種思想值得學習。
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(); } } }
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Spring Boot整合QueryDSL的實現(xiàn)示例
這篇文章主要介紹了Spring Boot整合QueryDSL的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-09-09如何解決HttpServletRequest.getInputStream()多次讀取問題
這篇文章主要介紹了如何解決HttpServletRequest.getInputStream()多次讀取問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07Spring?Native打包本地鏡像的操作方法(無需通過Graal的maven插件buildtools)
這篇文章主要介紹了Spring?Native打包本地鏡像,無需通過Graal的maven插件buildtools,本文探索一下,如果不通過這個插件來生成鏡像,結(jié)合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2023-02-02探究springboot中的TomcatMetricsBinder
springboot的TomcatMetricsBinder主要是接收ApplicationStartedEvent然后創(chuàng)建TomcatMetrics執(zhí)行bindTo進行注冊,TomcatMetrics主要注冊了globalRequest、servlet、cache、threadPool、session相關的指標,本文給大家介紹的非常詳細,需要的朋友參考下吧2023-11-11關于Java整合RocketMQ實現(xiàn)生產(chǎn)消費詳解
這篇文章主要介紹了關于Java整合RocketMQ實現(xiàn)生產(chǎn)消費詳解,RocketMQ作為一款純java、分布式、隊列模型的開源消息中間件,支持事務消息、順序消息、批量消息、定時消息、消息回溯等,需要的朋友可以參考下2023-05-05idea環(huán)境下Maven無法正常下載pom中配置的包問題
這篇文章主要介紹了idea環(huán)境下Maven無法正常下載pom中配置的包的問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06