【问题标题】:how to parallelize a java program with Stream Java 8 [duplicate]如何使用 Stream Java 8 并行化 Java 程序 [重复]
【发布时间】:2018-05-17 04:46:20
【问题描述】:

大家好,

我创建了一个简化程序来向您展示我愿意做什么。 这个想法是在每个顶点之间创建一条边。

顶点

public class Vertex {
    private String sequence = new String();

    public Vertex() {
    }

    public Vertex(String seq) {
        this.sequence = seq;
    }

    @Override
    public String toString() {
        return this.sequence.toString();
    }
}

边缘

public class Edge {

    private Vertex source;
    private Vertex destination;
    private int weight;

    public Edge() {

    }

    public Edge(Vertex source, Vertex destination, int weight) {
        this.source = source;
        this.destination = destination;
        this.weight = weight;

    }
}

召唤程序

public class Example {


    public static void main(String[] args) {

            ArrayList <Vertex> listOfVertex = new ArrayList<>();
            listOfVertex.add(new Vertex("One"));
            listOfVertex.add(new Vertex("Two"));
            listOfVertex.add(new Vertex("Three"));

            ArrayList <Edge> listOfEdges = new ArrayList<>();
            for (int i = 0; i < 3; i++) {
                for (int j = 0; j < 3; j++) {
                    if (i==j)
                        continue;
                    int weight = new Random().nextInt();
                    Edge edge = new Edge(listOfVertex.get(i), listOfVertex.get(j),weight);
                    listOfEdges.add(edge);
                }
            }
      }
}

通常在这一步中边缘列表应该有

  • 边 1:一二
  • 边 2:一三
  • 边缘 3:二一
  • 边缘 4:二三
  • 边 5:三一
  • 边 6:三二

如何使用Java Stream 来使用多线程? 我一整天都在搜索以了解 Java 8 for stream 的语法,但这非常困难。

【问题讨论】:

  • "如何使用Java Stream来使用多线程?" - 做什么?
  • 快速完成两个 for 循环,因为 1- 在我的实际程序中,我正在处理大量顶点,2 - Edge 的构建需要很长时间才能完成(重计算)。

标签: java multithreading arraylist java-8


【解决方案1】:

这里真的没有理由使用多线程。如果你有数百个顶点,也许。但无论如何:

List<Edge> edges = listOfVertex.parallelStream()
    .flatMap(v1 -> listOfVertex.stream()
                               .filter(v2 -> v2 != v1)
                               .map(v2 -> createEdge(v1, v2)))
    .collect(Collectors.toList());

【讨论】:

  • 非常感谢您的 Awnser ,它只是一个解释问题的简化程序。如果我把 My real program ,没有人会读它。另一个问题是什么意思:createEdge(v1, v2) ,它是返回 An Edge 的方法吗?
  • 是的。它在 v1 和 v2 之间创建一条边并将其返回。
  • 是的,好的,只是为了在几百个顶点之间添加一些东西。方法 createEdge (v1,v2) 花时间返回一条边,(一些计算)。
  • 我刚刚意识到你几个小时前已经问过同样的问题,我已经给你这个确切的答案了。您为什么不阅读原始答案? stackoverflow.com/a/47618095/571407
  • “这里真的没有理由使用多线程”——完全同意!我不确定即使对数千个节点进行并行化是否会带来任何性能提升 - 这是应该进行基准测试的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-04
  • 1970-01-01
  • 2017-04-27
  • 1970-01-01
  • 2017-02-18
  • 1970-01-01
  • 2016-04-25
相关资源
最近更新 更多