0
点赞
收藏
分享

微信扫一扫

Java: Fork/Join使用

编程练习生J 2022-03-11 阅读 86
java

序言

我们在Jdk8中使用Stream Api 和 CompletableFuture 的时候知道 他们都默认使用了ForkJoinPool线程池. 故此介绍下Fork/Join的框架.如题此框架是在Jdk7中引进的cuiyaonan2000@163.com

简介

Java.util.concurrent.ForkJoinPool由Java大师Doug Lea主持编写,它可以将一个大的任务拆分成多个子任务进行并行处理,最后将子任务结果合并成最后的计算结果,并进行输出。

我们举个例子:如果要计算一个超大数组的和,最简单的做法是用一个循环在一个线程内完成:

┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘

还有一种方法,可以把数组拆成两部分,分别计算,最后加起来就是最终结果,这样可以用两个线程并行执行:

┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘
┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘

如果拆成两部分还是很大,我们还可以继续拆,用4个线程并行执行:

┌─┬─┬─┬─┬─┬─┐
└─┴─┴─┴─┴─┴─┘
┌─┬─┬─┬─┬─┬─┐
└─┴─┴─┴─┴─┴─┘
┌─┬─┬─┬─┬─┬─┐
└─┴─┴─┴─┴─┴─┘
┌─┬─┬─┬─┬─┬─┐
└─┴─┴─┴─┴─┴─┘

这就是Fork/Join任务的原理:判断一个任务是否足够小,如果是,直接计算,否则,就分拆成几个小任务分别计算。这个过程可以反复“裂变”成一系列小任务。最终得到一个结果返还给调用者.

API

首先我们可以直接获取JDK默认的一个静态线程池,同时也可以获取该线程池的线程数

ForkJoinPool.commonPool();
ForkJoinPool.getCommonPoolParallelism();

 

 

通过Api我们可以看到ForkJoinPoo的主要方法如下图所示:

 

通过如上的内容我们可以看到ForkJoinPool提交任务主要分为如下3类

1)execute()方法 : 没有返回内容
2)invoke()方法 :  阻塞到任务返回结果
3)Submit()方法 : 异步,先返回一个Future对象,用来在需要的时候获取结果

用例

举报

相关推荐

0 条评论