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

我是否正确实现了forkjoin?

蒋波光
2023-03-14

使用Fork-Join框架的资源,创建一个同步多线程系统,从三个文本文件中形成一个最大长度的单词集合。不要使用中间集合来读取文本。在本例中,工作由存储在MaxLengthWord类的arr字段中的数组表示。createSubtasks()方法递归地将任务分成更小的工作部分,直到每个工作部分都小于阈值。

    import java.io.File;
import java.util.*;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;
import java.util.stream.Collectors;



public class loop {
    public static void main(String[] args) {

        File[] files = {
                new File("text"),
                new File("text2"),
                new File("text3")
        };

        MaxLengthWord sumOfDigits = new MaxLengthWord(files);

        ForkJoinPool pool = new ForkJoinPool();

        final List<String> maxWords = pool.invoke(sumOfDigits);
        System.out.println(maxWords);

    }
}

class MaxLengthWord extends RecursiveTask<List<String>> {
    File[] files;
    private static final int MAXWORDLENGTH = 7;

    public MaxLengthWord(File[] files) {
        this.files = files;
    }

    @Override
    protected List<String> compute() {
        if (files.length > 1) {
            return ForkJoinTask.invokeAll(createSubtasks())
                    .stream()
                    .flatMap(maxLengthWord -> maxLengthWord.join().stream())
                    .collect(Collectors.toList())
                    ;
        } else {
            return processing(files);
        }
    }

    private Collection<MaxLengthWord> createSubtasks() {
        List<MaxLengthWord> subTasks = new ArrayList<>();
        subTasks.add(new MaxLengthWord(
                Arrays.copyOfRange(files, 0, files.length / 2)));
        subTasks.add(new MaxLengthWord(
                Arrays.copyOfRange(files, files.length / 2, files.length)));
        return subTasks;
    }

    private List<String> processing(File[] files) {
        System.out.println(Thread.currentThread());
        List<String> result = new ArrayList<>();
        try (Scanner sc = new Scanner(files[0])) {
            while (sc.hasNext()) {
                String word = sc.next();
                if (word.length() == MAXWORDLENGTH) {
                    result.add(word);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
}

共有1个答案

傅浩漫
2023-03-14

流。flatMap()方法需要一个返回流的函数接口。因此,我将join()方法的结果转换为流。因此,这可能会有所帮助(至少可以编译):

@Override
protected List<String> compute() {
    if (files.length > 1) {
        return ForkJoinTask.invokeAll(createSubtasks())
                .stream()
                .flatMap(j->j.join().stream())
                .collect(Collectors.toList());
    } else {
        return processing(files);
    }
}
 类似资料:
  • 问题内容: 由于对设计模式和体系结构不熟悉,我很难向他人确切说明我的最新应用程序是如何设计的。我已经在认为它是纯n层,纯MVC和表示层中具有MVC的n层之间切换。目前,我认为后者是正确的,但我希望更多有经验的开发人员能有所作为。 浏览器将HTTP请求发送到Tomcat。通过web.xml将请求映射到servlet(我称为控制器) 控制器实例化一个或多个业务对象并在其上调用方法,即,该对象将在调用一

  • 在我的JavaSpringMVC应用程序中,我有一个返回用户的DAO。DAO经常被命中,所以我尝试缓存用户。 我是这样做的(如下),但我不知道我是否做对了。 我在想使得它只运行一次,并且所有其他时间的值都将从缓存中加载。 和上的和会在发生更新或删除时清除缓存。 那是正确的吗?如果是,什么时候使用合适?

  • 问题内容: 我想在Java中使用池化连接(因为每个线程创建一个连接非常昂贵),所以我正在使用该对象。我正在跨线程保留我的数据源。因此,我在整个应用程序中仅使用一个数据源,如下所示: 现在,我已经创建了数据源,然后在每个单独的线程中执行以下操作: 我猜我很困惑, 这真的 是在 获取池连接吗? 这个线程安全吗?我注意到PooledConnection具有诸如notify()和wait()之类的方法…这

  • 我是DSA的初学者,最近几天我一直在尝试使用邻接列表找到图形的正确实现。 下面我给出了我认为邻接列表是如何实现的整个代码。 我从头开始创建了一个SiinglyLinkedlist。并且我正在使用一个Hashmap来改进时间复杂性。 Hashmap中的整数键充当顶点&在其值中包含一个Linkedlist。 在顶点中,我存储了整数ID,在Linkedlist中,我存储了该ID的所有好友名。 图中有3种

  • 问题内容: 我正在实现一个可序列化的类(因此,它是一个使用RMI的值对象)。但是我需要测试一下。有没有一种方法可以轻松做到这一点? 澄清 :我正在实现该类,因此将Serializable保留在类定义中很简单。我需要手动对其进行序列化/反序列化,以查看其是否有效。 问题答案: 简单的方法是检查对象是否为或的实例,但这并不能真正证明该对象确实可序列化。 唯一可以确定的方法是实际尝试。最简单的测试是这样

  • 我们的应用程序使用各种类型的队列。每次在启动使用队列的应用程序之前,都会进行一次自动预检查,将示例消息写入所需队列并读取(即删除)它,以确认队列设置是否正确。 现在我们也用Kafka。但是在Kafka中,我们不能通过写和读带有主题的消息来进行预检查,因为在启动实际应用程序之前不能删除这些消息,这会“污染”主题。在Kafka中是否有其他自动化的方法,API或命令行脚本来实现这一点?最好使用java或