版权声明:本文为神州灵云作者的原创文章,未经神州灵云允许不得转载。
本文作者:Kevin
引言:
相比传统顺序编程,多线程并发编程在运行效率有这巨大的优势,但是由于线程资源的共享,线程同步等问题,多线程编程的难度也要高许多。Java是最先支持多线程的开发的语言之一,Java 提供了许多方便好用的多线程并发方法,理解并合理地运用它们,会让我们在开发中受益匪浅。Fork/Join框架就是一个充分利用多线程优势,集“分治”与“并行”一体的并发框架。
1. Fork/Join框架思想
Fork/Join框架从名字就可以初见端倪,Fork(分支)的意思是将任务分离,Join(合并)将结果合并。Fork/Join框架的核心思想是“分治”,将一个问题分解为多个小问题,这些问题相互独立,得到所有小问题的结果后就可以得到整个问题的结果。
在传统编程中,我们可以采取递归的方式实现具有一定规律的问题分治,但是由于频繁的函数调用,栈切换,递归的运行效率十分低下。Fork/Join框架提供了分治问题的多线程并发解决方案,提供了高效的实现。
2. Fork/Join框架原理
Fork/Join框架建立在Java线程池的基础之上,主要通过ForkJoinPool,ForkJoinTask类实现:
ForkJoinPool是ExecutorService的实现类,是一种特殊的线程池,ForkJoinTask则是ForkJoinPool线程池可接受的任务对象,分为RecursiveTask(带执行结果的任务)和RecursiveAction(没有执行结果的任务)。 ForkJoinPool接收提交的ForkJoinTask,为任务及其分支子任务分配线程。
3. 关于线程池
ForkJoinPool是一种特殊的线程池,要了解它得先了解Java线程池,这里只大致展示Java线程池的结构,不做深入分析。
线程池内维护一个核心池,每次有任务提交,会提供一个线程执行任务,直至池中线程数量达到最大值,之后无法立即执行的任务会被存放到任务队列内(workQueue),池内任务完成后再从队列中取出任务继续执行。
线程池的线程生成销毁策略,队列类型,最大核心池数量,任务拒绝策略等都是可配置的,使得Java线程池可以应对不同的场景与问题。而ForkJoinPool就是其中的一种实现。
4. Fork/Join实现</