Java线程池ForkJoinPool实例解析

时间:2021-05-20

这篇文章主要介绍了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(); } }}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章