java fork join实例_Java线程池ForkJoinPool实例解析

这篇文章主要介绍了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[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

// 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 {

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

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();

}

}

}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值