Fork/Join框架是Java 7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务 结 果 后得到大任务结果的框架。Fork/Join框架要完成两件事情:
1.任务分割:首先Fork/Join框架需要把大的任务分割成足够小的子任务,如果子任务比较大的话还要对子任务进行继续分割
2.执行任务并合并结果:分割的子任务分别放到双端队列里,然后几个启动线程分别从双端队列里获取任务执行。子任务执 行完的结果都放在另外一个队列里,启动一个线程从队列里取数据,然后合并这些数据。
算法是指某个线程从其他队列里窃取任务来执行。
为什么需要使用工作窃取算法呢?
假如我们需要做一个比较大的任务,我们可以把这个任务分割为若干互不依赖的子任务,为了减少线程间的竞争,于是 把 这 些 子任务分别放到不同的队列里,并为每个队列创建一个单独的线程来执行队列里的任务,线程和队列一一对应, 比如A线程负责处理A队列里的任务。
工作窃取算法的优点:充分利用线程进行并行计算,减少了线程间时竟争。
工作窃取算法的缺点:在某些情况下还是存在竞争,比如双端队列里只有一个任务时。
1 分割任务
2 执行任务并合并结果
ForkJoinPool
由ForkJoinTask数组和ForkJoinWorkerThread数组组成,ForkJoinTask数组负责将存放程序提交给ForkJoinPool,而 ForkJoinWorkerThread负责执行这些任务。
有两种构造器方式可以获取ForkJoinPool
的实例,第一种使用构造器创建:
并行性的级别决定了可以并发执行的线程的数量。换句话说,它决定了可以同时执行的任务的数量——但不能超过处理器的数 量。
但是,这并不限制池可以管理的任务的数量。ForkJoinPool可以管理比其并行级别多得多的任务。
ForkJoinTask
ForkJoinTask代表运行在ForkJoinPool中的任务。
主要方法:
子类:
实例:
Fork/Join框架的异常处理
ForkJoinTask在执行的时候可能会抛出异常,但是我们没办法在主线程里直接捕获异常,所以ForkJoinTask提供了isCompletedAbnormally()方法来检查任务是否已经抛出异常或已经被取消了,并且可以通过ForkJoinTask的getException方法获取异常
原文:https://www.cnblogs.com/shu-java-net/p/13527468.html