【问题标题】:Let callables/threads work on copy of an object in Java让可调用对象/线程在 Java 中处理对象的副本
【发布时间】:2016-04-10 15:24:18
【问题描述】:

我有一个工作代码,我在其中计算从每个点(Dijkstra 算法)到图中每个点的最短路径。

但只要我想在我的 ExecuterService 中使用超过 1 个线程,它们都会在同一个图表上工作以计算结果,这当然会使结果无法使用。

我怎样才能使一个线程获得自己的图形副本,以便在该线程上运行的可调用对象不会干扰其他线程?这可能吗?

【问题讨论】:

  • 只需为您的图提供适当的复制方法,并让其他线程在复制的图上工作。
  • 我如何告诉不同的可调用对象他们应该在哪个图表上运行?这取决于它们在哪个线程上运行。
  • 你能提供一些简短的代码吗?我不确定你想做什么。
  • 这是关于 Java 并发 API 的问题还是关于您自己制作的图形结构的问题?

标签: java multithreading parallel-processing dijkstra callable


【解决方案1】:

作为Keqiang Li commented,您需要定义一种机制来复制您已有的单一图形数据结构。但是,由于您显然需要先构建结构本身,然后再创建它的多个副本,因此一个常用的技巧是使用builder pattern 来创建您将实际执行搜索的不可变对象。请注意,这不需要在实际单独的例如GraphBuilder 类,但您可以简单地实现一种机制来创建单个可变图形结构的不可变副本,您最初在读取数据时增量构建该结构:

public class MutableDirectedGraph implements DirectedGraph {

    public MutableDirectedGraph() {
        ...
    }

    public Edge addEdge(final Node start, final Node end, final String label, final double weight) {
        ...
    }

    public Node addNode() {
        ...
    }

     ...
}

public class ImmutableDirectedGraph implements DirectedGraph {

    public ImmutableDirectedGraph(final DirectedGraph copyee) {
        ...
    }

    ...
}

这种方法的一个好处是您可以实现MutableDirectedGraph,以便以增量方式轻松修改/构建,然后通过优化搜索来实现ImmutableDirectedGraph(例如,将Edge对象通过它们各自的ID存储在在可变版本中使用基于 Map 的存储时用于内存高效存储的数组)。这样,为两个特定任务创建两个单独的类对于程序员和计算机处理可能会更快。

【讨论】:

  • @Reyny:如果这个答案对您有所帮助,如果您能accept it,我将不胜感激,因为我目前正在寻找一些额外的声誉点。另外,它也给你一些额外的分数。非常感谢您的帮助。
猜你喜欢
  • 2012-04-26
  • 1970-01-01
  • 2018-04-29
  • 1970-01-01
  • 1970-01-01
  • 2015-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多