Java線程池ForkJoinPool實(shí)例解析
這篇文章主要介紹了Java線程池ForkJoinPool實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
背景:ForkJoinPool的優(yōu)勢(shì)在于,可以充分利用多cpu,多核cpu的優(yōu)勢(shì),把一個(gè)任務(wù)拆分成多個(gè)“小任務(wù)”,把多個(gè)“小任務(wù)”放到多個(gè)處理器核心上并行執(zhí)行;當(dāng)多個(gè)“小任務(wù)”執(zhí)行完成之后,再將這些執(zhí)行結(jié)果合并起來(lái)即可。這種思想值得學(xué)習(xí)。
import java.io.IOException; import java.util.Arrays; import java.util.Random; import java.util.concurrent.RecursiveAction; import java.util.concurrent.RecursiveTask; /** * 分割 合并 線程池 * 類似于遞歸的歸并排序,這個(gè)是多線程的遞歸排序 * 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類寫(xiě)起來(lái)比較麻煩, * 可以繼承RecursiveAction(無(wú)返回值)和RecursiveTask(遞歸任務(wù),有返回值) */ // 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(); } } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Spring Boot整合QueryDSL的實(shí)現(xiàn)示例
這篇文章主要介紹了Spring Boot整合QueryDSL的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09如何解決HttpServletRequest.getInputStream()多次讀取問(wèn)題
這篇文章主要介紹了如何解決HttpServletRequest.getInputStream()多次讀取問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07Spring?Native打包本地鏡像的操作方法(無(wú)需通過(guò)Graal的maven插件buildtools)
這篇文章主要介紹了Spring?Native打包本地鏡像,無(wú)需通過(guò)Graal的maven插件buildtools,本文探索一下,如果不通過(guò)這個(gè)插件來(lái)生成鏡像,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02Java實(shí)現(xiàn)時(shí)間動(dòng)態(tài)顯示方法匯總
這篇文章主要介紹了Java實(shí)現(xiàn)時(shí)間動(dòng)態(tài)顯示方法匯總,很實(shí)用的功能,需要的朋友可以參考下2014-08-08Java實(shí)戰(zhàn)之簡(jiǎn)單的文件管理器
這篇文章主要介紹了Java實(shí)戰(zhàn)之簡(jiǎn)單的文件管理器,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04探究springboot中的TomcatMetricsBinder
springboot的TomcatMetricsBinder主要是接收ApplicationStartedEvent然后創(chuàng)建TomcatMetrics執(zhí)行bindTo進(jìn)行注冊(cè),TomcatMetrics主要注冊(cè)了globalRequest、servlet、cache、threadPool、session相關(guān)的指標(biāo),本文給大家介紹的非常詳細(xì),需要的朋友參考下吧2023-11-11關(guān)于Java整合RocketMQ實(shí)現(xiàn)生產(chǎn)消費(fèi)詳解
這篇文章主要介紹了關(guān)于Java整合RocketMQ實(shí)現(xiàn)生產(chǎn)消費(fèi)詳解,RocketMQ作為一款純java、分布式、隊(duì)列模型的開(kāi)源消息中間件,支持事務(wù)消息、順序消息、批量消息、定時(shí)消息、消息回溯等,需要的朋友可以參考下2023-05-05idea環(huán)境下Maven無(wú)法正常下載pom中配置的包問(wèn)題
這篇文章主要介紹了idea環(huán)境下Maven無(wú)法正常下載pom中配置的包的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06