RecursiveAction:用于任务没有返回结果的场景。
RecursiveTask:用于任务有返回结果的场景。
本章接下来将展示如何利用Fork/Join框架高效地工作。
在本节,我们将学习如何使用Fork/Join框架的基本元素。它包括:
创建用来执行任务的ForkJoinPool对象;
创建即将程池中被执行的任务ForkJoinTask子类。
本范例中即将使用的Fork/Join框架的主要特性如下:
采用默认的构造器创建ForkJoinPool对象;
在任务中将使用JavaAPI文档推荐的结构。
if (problem size > default size){
tasks=divide(task);
execute(tasks);
} else {
resolve problem using another algorithm;
}
我们将以同步的方式执行任务。当一个主任务执行两个或更多的子任务时,这个主任务将等待子任务的完成。用这种方法,执行主任务的线程,称之为工作者线程(Worker Thread),它将寻找其他的子任务来执行,并在子任务执行的时间里利用所有的线程优势。
如果将要实现的任务没有返回任何结果,那么,采用RecursiveAction类作为实现任务的基类。
本节的范例是在EclipseIDE里完成的。无论你使用Eclipse还是其他的IDE(比如NetBeans),都可以打开这个IDE并且创建一个新的Java工程。
在本节,我们将实现一项更新产品价格的任务。最初的任务将负责更新列表中的所有元素。我们使用10来作为参考大小(ReferenceSize),如果一个任务需要更新大于10个元素,它会将这个列表分解成为两部分,然后分别创建两个任务用来更新各自部分的产品价格。
按照接下来的步骤实现本节的范例。
1.创建一个名为Product的类,用来存储产品的名称和价格。
public class Product {
2.声明一个名为name的私有String属性,一个名为price的私有double属性。
private String name;
private double price;
3.实现两个属性各自的设值与取值方法。
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
4.创建一个名为ProductListGenerator的类,用来生成一个随机产品列表。
public class ProductListGenerator {
5.实现generate()方法。接收一个表示列表大小的int参数,并返回一个生成产品的List列表。
public List<Product> generate (int size) {
6.创建返回产品列表的对象ret。
List<Product> ret=new ArrayList<Product>();
7.生成产品列表,给所有的产品分配相同的价格,比如可以检查程序是否运行良好的数字10。
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-40557-2.html
把侵略者溺死在南海
错了应该是世界第一