ForkJoinTask类也包含了在范例中所使用的invokeAll()方法的其他版本,这些版本如下。
invokeAll(ForkJoinTask< ? >… tasks):这个版本的方法接收一个可变的参数列表,可以传递尽可能多的ForkJoinTask对象给这个方法作为参数。
invokeAll(Collectiontasks):这个版本的方法接受一个泛型类型T的对象集合(比如,ArrayList对象、LinkedList对象或者TreeSet对象)。这个泛型类型T必须是ForkJoinTask类或者它的子类。
虽然ForkJoinPool类是设计用来执行ForkJoinTask对象的,但也可以直接用来执行Runnable和Callable对象。当然,也可以使用ForkJoinTask类的adapt()方法来接收一个Callable对象或者一个Runnable对象,然后将之转化为一个ForkJoinTask对象,然后再去执行。
Fork/Join框架提供了执行任务并返回结果的能力。这些类型的任务都是通过RecursiveTask类来实现的。RecursiveTask类继承了ForkJoinTask类,并且实现了由执行器框架(Executor Framework)提供的Future接口。
在任务中,必须使用Java API文档推荐的如下结构:
if (problem size > size){
tasks=Divide(task);
execute(tasks);
groupResults()
return result;
} else {
resolve problem;
return result;
}
如果任务需要解决的问题大于预先定义的大小,那么就要将这个问题拆分成多个子任务,并使用Fork/Join框架来执行这些子任务。执行完成后,原始任务获取到由所有这些子任务产生的结果,合并这些结果,返回最终的结果。当原始任务程池中执行结束后,将高效地获取到整个问题的最终结果。
在本节,我们将学习如何使用Fork/Join框架来解决这种问题,开发一个应用程序,在文档中查找一个词。我们将实现以下两种任务:
一个文档任务,它将遍历文档中的每一行来查找这个词;
一个行任务,它将在文档的一部分当中查找这个词。
所有这些任务将返回文档或行中所出现这个词的次数。
本节的范例是在EclipseIDE里完成的。无论你使用Eclipse还是其他的IDE(比如NetBeans),都可以打开这个IDE并且创建一个新的Java工程。
按照接下来的步骤实现本节的范例。
1.创建一个名为DocumentMock的类。它将生成一个字符串矩阵来模拟一个文档。
public class Document {
2.用一些词来创建一个字符串数组。这个数组将被用来生成字符串矩阵。
private String words[]={"the","hello","goodbye","packt", "java","t
hread","pool","random","class","main"};
3.实现generateDocument()方法。它接收3个参数,分别是行数numLines,每一行词的个数numWords,和准备查找的词word。然后返回一个字符串矩阵。
public String[][] generateDocument(int numLines, int numWords,
String word){
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-40557-6.html
人家的确是在公海航行