Java线程池ForkJoinPool实例解析

网友投稿 423 2022-12-15


Java线程池ForkJoinPool实例解析

这篇文章主要介绍了java线程池ForkJGQOneioinPool实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

背景: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);

}

Systehttp://m.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();

}

}

}

nums[i] = random.nextInt(100);

}

Systehttp://m.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();

}

}

}

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

}

}

}

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

}

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java重写(Override)与重载(Overload)区别原理解析
下一篇:Java类加载器ClassLoader用法解析
相关文章

 发表评论

暂时没有评论,来抢沙发吧~