【问题标题】:Java 7: Fork/Join Example - Did I get this right?Java 7:Fork/Join 示例 - 我做对了吗?
【发布时间】:2012-07-19 04:18:03
【问题描述】:

Java 7 并发和并行特性 - Fork/Join 框架让我手忙脚乱。

我正在尝试显示给定路径下所有目录的列表。谁能告诉我这是否正确?

这是我的主要课程 - 启动任务的 JoinForkExample

package com.skilledmonster.examples;

import java.io.File;
import java.util.List;
import java.util.concurrent.ForkJoinPool;

public class JoinForkExample {
    public static void main(String[] args) {
        ForkJoinPool forkJoinPool = new ForkJoinPool() ;
        List<File> directories = forkJoinPool.invoke(new DirectoryListingTask(new File("C:/xampp"))) ;
         for (int i = 0; i < directories.size(); i++) {
            File file = (File) directories.get(i);
            System.out.println(file.getAbsolutePath());
        }
    }
}

这是我的实际任务

package com.skilledmonster.examples;

import java.io.File;
import java.io.FileFilter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.RecursiveTask;

public class DirectoryListingTask extends RecursiveTask<List<File>> {

    private static final FileFilter filter = new DirectoryFilter();

    private File file ;

    public DirectoryListingTask(File file) {
        this.file = file;
    }

    @Override
    protected List<File> compute() {
       List<RecursiveTask<List<File>>> forks = new LinkedList<>(); 
       List files = new ArrayList();
        if (file.isDirectory()) {
            File[] filteredFiles = file.listFiles(filter);
            if (null != filteredFiles) {
                files.addAll(Arrays.asList(filteredFiles));
            }
            for (File childFile : file.listFiles()) {
                DirectoryListingTask task = new DirectoryListingTask(childFile);
                forks.add(task);
                task.fork();
            }

            for (RecursiveTask<List<File>> task : forks) {
                files.addAll(task.join());
            }
        }
        return files ;
    }
}

我几乎得到了预期的结果。但我不太确定我是否做对了。令人惊讶的是,即使我在不​​使用 join/fork 框架的情况下执行相同的操作,我也没有注意到执行的任何时间差异。

任何想法!

【问题讨论】:

    标签: java java-7 fork-join


    【解决方案1】:

    由于这项工作主要受 IO 限制,因此在这里使用 Fork/Join 并不是很有帮助。我建议改为尝试一些计算密集型任务。另外,请注意 Fork/Join 操作有开销。如果你用它来计算斐波那契数列,它就配不上它。而且我预计性能会比顺序版本慢。

    【讨论】:

    • 你是对的!我记得在 Oracle 技术网络文档之一中读到“ork/join 任务应该作为‘纯’内存中算法运行,其中没有 I/O 操作发挥作用”。你能给我推荐任何其他可以使用它的实时示例吗?
    • 也许是一些任务,比如快速排序。如果我们将它应用于非常大规模的问题,我们应该小心。导致在 Fork/Join 模式中,父级等待子级完成工作,然后父级才能完成。如果你的问题规模足够大,你会得到一个很大的任务队列。它可能会导致像 OutOfMemory 这样的问题。
    • 试试 MergeSort,它是一种递归算法。但是由于每个递归步骤都将问题分成 2 个相等平衡的子问题,因此它们可以被分叉。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    • 2011-04-09
    • 2011-01-04
    • 1970-01-01
    • 2017-12-26
    • 2020-03-26
    相关资源
    最近更新 更多