fork join框架使用简单实例
使用RecursiveTask实现一个累加的功能,使用分而治之的思想,实现分段求和后汇总。
public class SumTask extends RecursiveTask<Integer> {
private Integer start = 0;
private Integer end = 0;
public SumTask(int start, int end) {
this.start = start;
this.end = end;
}
@Override
protected Integer compute() {
if (end - start < 100) {
//小于100时直接返回结果
int sumResult = 0;
for (int i = start; i <= end; i++) {
sumResult += i;
}
return sumResult;
} else {
//大于一百时进行分割
int middle = (end + start) / 2;
SumTask leftSum = new SumTask(this.start, middle);
SumTask rightSum = new SumTask(middle, this.end);
leftSum.fork();
rightSum.fork();
return leftSum.join() + rightSum.join();
}
}
public static void main(String[] args) {
SumTask sumTask = new SumTask(1, 999999);
sumTask.fork();
System.out.print("result:" + sumTask.join());
}
}
默认线程数
默认线程池有固定的线程数,会根据可用的 availableProcessors 来计算线程数量。
/**
* Creates a {@code ForkJoinPool} with parallelism equal to {@link
* java.lang.Runtime#availableProcessors}, using the {@linkplain
* #defaultForkJoinWorkerThreadFactory default thread factory},
* no UncaughtExceptionHandler, and non-async LIFO processing mode.
*
* @throws SecurityException if a security manager exists and
* the caller is not permitted to modify threads
* because it does not hold {@link
* java.lang.RuntimePermission}{@code ("modifyThread")}
*/
public ForkJoinPool() {
this(Math.min(MAX_CAP, Runtime.getRuntime().availableProcessors()),
defaultForkJoinWorkerThreadFactory, null, false);
}
自定义线程数
如果想使用自定义线程池,比如100个线程的线程池,可以如下:
public static void main(String[] args) {
ForkJoinPool forkJoinPool=new ForkJoinPool(100);
SumTask sumTask = new SumTask(1, 999999);
forkJoinPool.submit(sumTask);
System.out.print("result:" + sumTask.join());
}
当然无论你初始化多少线程,都只会有和CPU数量相等的几个线程运行。