您的位置:首页 > 编程语言 > Java开发

Java Fork/join框架

2015-04-14 14:28 295 查看
Fork/join框架是用来解决能够通过分治技术将问题拆分成小任务的问题。在一个任务中,先检查将要解决的问题的大小,如果大于一个设定的大小,那就将问题拆分成可以通过框架来执行的小任务。如果问题的大小比设定的大小要小,就可以直接在任务里解决这个问题,然后,根据需要返回任务的结果。上图

没有固定的公式来决定问题的参考大小,从而决定一个任务是需要进行拆分或不需要拆分,拆分与否是否依赖于任务本身的特性。可以使用在任务中将要处理的元素的特性。可以使用在任务中将要处理的元素的数目和任务执行所需要的时间来决定参考大小。测试不同的参考大小来决定解决问题最好的一个方案,将ForkJoinPool类看作一个特殊的Executor执行器类型,这个框架基于一下两种操作。

1.分解(fork)操作:当需要将一个任务拆分成更小的多个任务时,在框架中执行这些任务

2.合并(join)操作:当一个主任务等待其创建的多个子任务的完成执行。

Fork/Join框架和执行器框架主要的区别在与工作窃取算法。与执行器框架不同,使用Join操作让一个主任务等待它所创建的子任务的完成,执行这个任务的线程称之为工作者线程。工作者线程寻找其他仍未被执行的任务,然后开始执行。通过这种方式,这些线程在运行时拥有所有的优点,进而提升应用程序的性能。

为了达到这个目标,通过Fork/Join框架执行的任务有以下限制。

1.任务只能使用fork()和join()操作当作同步机制。如果使用其他的同步机制,工作者线程就不能执行其他任务,当然这些任务是在同步操作里时。比如,如果在Fork/Join框架中将一个任务休眠,正在执行这个任务的工作者线程在休眠期内不能执行另外一个任务

2.任务不能执行I/O操作,比如文件数据的读取和写入

3.任务不能抛出非运行时异常,必须在代码中处理这些异常、

Fork/Join框架的核心是由下列两个类组成的

ForkJoinPool:这个类实现了ExecutorService接口和工作窃取算法(Work-Stealing-Algorithm)。它管理工作者线程,并提供任务的状态信息,以及任务的执行信息。

ForkJonTask:这个类是一个将在ForkJoinPool中执行的任务的基类。

Fork/join框架提供了一个在任务里执行fork()和join()操作的机制和控制任务状态的方法,通常,为了实现Fork/join任务,需要实现一下两个类之一的子类。

RecursiveAction:用于任务没有返回结果的场景

RecursiveTask:用于任务有返回结果的场景
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: