Java线程池(ForkJoinPool)

Java的线程池

Java的Lock实现类介绍
  1. Java7 提供了ForkJoinPool来支持将一个任务拆分成多个“小任务”并行计算,再把多个“小任务”的结果合并成总的计算结果。
  2. ForkJoinPool是ExecutorService的实现类,因此是一种特殊的线程池。
  3. ForkJoinPool主要用来使用分治法(Divide-and-Conquer Algorithm)来解决问题。。
ForkJoinPool介绍
ForkJoinPool 介绍
  1. 案例
import java.util.Random;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.Future;
import java.util.concurrent.RecursiveTask;

/**
 * ClassName:ForJoinPollTask 
* Function: 对一个长度为100的元素值进行累加 * Date: 2017年12月4日 下午5:41:46
* @author prd-lxw * @version 1.0 * @since JDK 1.7 * @see */ public class ForJoinPollTask { public static void main(String[] args) throws Exception { int[] arr = new int[100]; Random random = new Random(); int total =0; //初始化100个数组元素 for(int i=0,len = arr.length;i future = pool.submit(task); //提交分解的SumTask 任务 System.out.println("多线程执行结果:"+future.get()); pool.shutdown(); //关闭线程池 } } /** * ClassName: SumTask
* Function: 继承抽象类RecursiveTask,通过返回的结果,来实现数组的多线程分段累累加 * RecursiveTask 具有返回值 * date: 2017年12月4日 下午6:08:11
* * @author prd-lxw * @version 1.0 * @since JDK 1.7 */ class SumTask extends RecursiveTask{ private static final int THRESHOLD = 20; //每个小任务 最多只累加20个数 private int arry[]; private int start; private int end; /** * Creates a new instance of SumTask. * 累加从start到end的arry数组 * @param arry * @param start * @param end */ public SumTask(int[] arry, int start, int end) { super(); this.arry = arry; this.start = start; this.end = end; } @Override protected Integer compute() { int sum =0; //当end与start之间的差小于threshold时,开始进行实际的累加 if(end - start

使用介绍

ForkJoinTask:我们要使用ForkJoin框架,必须首先创建一个ForkJoin任务。它提供在任务中执行fork()和join()操作的机制,通常情况下我们不需要直接继承ForkJoinTask类,而只需要继承它的子类,Fork/Join框架提供了以下两个子类:
 
RecursiveAction:用于没有返回结果的任务。
RecursiveTask :用于有返回结果的任务。

ForkJoinPool :ForkJoinTask需要通过ForkJoinPool来执行,任务分割出的子任务会添加到当前工作线程所维护的双端队列中,进入队列的头部。当一个工作线程的队列里暂时没有任务时,它会随机从其他工作线程的队列的尾部获取一个任务。
  线程池监控
  在线程池使用监控方面,主要通过如下方法:
  isTerminated—判断线程池对应的workQueue中是否有待执行任务未执行完;
  awaitTermination—判断线程池是否在约定时间内完成,并返回完成状态;
  getQueuedSubmissionCount—获取所有待执行的任务数;
  getRunningThreadCount—获取正在运行的任务数。

https://www.jianshu.com/p/32a15ef2f1bf
ps:ForkJoinPool在执行过程中,会创建大量的子任务,导致GC进行垃圾回收,这些是需要注意的。

你可能感兴趣的:(java)