本节将学习如何使用ForkJoinPool和ForkJoinTask类所提供的异步方法来管理任务。我们将实现一个程序:在一个文件夹及其子文件夹中来搜索带有指定扩展名的文件。ForkJoinTask类将实现处理这个文件夹的内容。而对于这个文件夹中的每一个子文件,任务将以异步的方式发送一个新的任务给ForkJoinPool类。对于每个文件夹中的文件,任务将检查任务文件的扩展名,如果符合条件就将其增加到结果列表中。
本节的范例是在EclipseIDE里完成的。无论你使用Eclipse还是其他的IDE(比如NetBeans),都可以打开这个IDE并且创建一个新的Java工程。
按照接下来的步骤实现本节的范例。
1.创建名为FolderProcessor的类,并继承RecursiveTask类,RecursiveTask类的泛型参数为List类型。
public class FolderProcessor extends RecursiveTask<List<String>> {
2.声明类的serialVersionUID属性。这个元素是必需的,因为RecursiveTask类的父类ForkJoinTask实现了Serializable接口。
private static final long serialVersionUID = 1L;
3.声明一个名为path的私有String属性,用来存储任务将要处理的文件夹的完整路径。
private String path;
4.声明一个名为extension的私有String属性,用来存储任务将要查找的文件的扩展名。
private String extension;
5.实现类的构造器,用来初始化这些属性。
public FolderProcessor (String path, String extension) {
this.path=path;
this.extension=extension;
}
6.实现compute()方法。既然指定了RecursiveTask类泛型参数为List类型,那么,这个方法必须返回一个同样类型的对象。
@Override
protected List<String> compute() {
7.声明一个名为list的String对象列表,用来存储文件夹中文件的名称。
List<String> list=new ArrayList<>();
8.声明一个名为tasks的FolderProcessor任务列表,用来存储子任务,这些子任务将处理文件夹中的子文件夹。
List<FolderProcessor> tasks=new ArrayList<>();
9.获取文件夹的内容。
File file=new File(path);
File content[] = file.listFiles();
10.对于文件夹中的每一个元素,如果它是子文件夹,就创建一个新的FolderProcessor对象,然后调用fork()方法采用异步方式来执行它。
if (content != null) {
for (int i = 0; i < content.length; i++) {
if (content[i].isDirectory()) {
FolderProcessor task=new FolderProcessor(content[i].getAbsolutePath(), extension);
task.fork();
tasks.add(task);
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-40557-12.html
好好笑
亲