当前位置: 首页 > 知识库问答 >
问题:

Java7:分叉/加入示例-我做对了吗?

齐嘉庆
2023-03-14

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框架,我也没有注意到执行过程中的任何时间差。

任何想法!

共有1个答案

薛弘厚
2023-03-14

由于这项工作主要是IO绑定的,所以在这里使用Fork/Join没有多大帮助。我建议尝试一些计算密集型任务。另外,请注意Fork/Join操作有开销。如果你用它来计算斐波纳契级数,它就不配了。我希望性能比顺序版本慢。

 类似资料:
  • 问题内容: 我正在练习 自我连接 ,这是我编写查询时不了解的事情。 我有桌子 雇员表包含三个记录。 最后一列manager_id是指使Ahmed和Tove成为Ola经理的第一列ID。 如果我这样写查询 结果使艾哈迈德和托夫经理。然而 正确无误,有人可以解释吗? 问题答案: 自联接就像内部联接,其中同一表的两个或更多实例通过公共数据类型的列/字段联接在一起。这种连接(内部连接)根据连接条件给出公共行

  • 在这里,我使用了一个点切割注释,如下所示: 它给了我一个例外,那就是: 我刚刚开始学习AOP。任何建议或帮助都会有很大帮助。谢谢。

  • 这个例子取自一本关于依赖注入的书。 在第87页,有这个例子。 我理解代码的用途,但我不理解的是如何声明或配置我的,以便我可以创建这个类的实例。 似乎注入了< code > deliver factory 。这个例子没有说是如何实现的,但是让我们承认它是通过构造函数注入实现的。在这种情况下,如何传递<代码>列表 我不明白的是,如何在构造函数的签名中同时自动注入对象和实例特定对象。在这种情况下,我不知

  • 确实存在所谓的超操作序列。它的工作原理就像你构造乘法,加上许多重复次。然后是指数化,其中有许多的乘法重复次。然后,就有了四舍五入,表示为一个指数塔,就像,重复次。 我有兴趣如何写这个函数,对于浮点数和复数? 我已经用glsl编写了乘法和求幂函数: 但是我被卡住了!我们如何编写tetration函数,不仅针对浮点数,而且针对整个复平面本身?

  • 我正在做一个项目,我的意图是运行一个玉米作业,并发送邮件给我的朋友,祝他们生日,我能够从MySQL DB获取电子邮件,并将其与当前日期进行比较,但当涉及到发送电子邮件时,我得到NullPointerException。 我确信应用程序属性没有问题,我在其他项目中也使用了它们,它们的功能正常 这是我得到以下信息的错误

  • 通过作曲家安装Moltin Cart,然后添加服务提供商:并添加别名