Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
让可调用函数/线程处理Java中对象的副本_Java_Multithreading_Parallel Processing_Dijkstra_Callable - Fatal编程技术网

让可调用函数/线程处理Java中对象的副本

让可调用函数/线程处理Java中对象的副本,java,multithreading,parallel-processing,dijkstra,callable,Java,Multithreading,Parallel Processing,Dijkstra,Callable,我有一个工作代码,其中我计算从图中的每个点(Dijkstra算法)到每个点的最短路径 但是,只要我想在ExecuterService中使用多个线程,它们都将在同一个图上计算结果,这当然会使结果无法使用 如何使一个线程获得自己的图形副本,以便在该线程上运行的可调用项不会干扰其他线程?这可能吗?因为,您需要定义一种机制来复制您已有的单个图形数据结构。但是,由于在创建结构的多个副本之前,显然需要首先构建结构本身,因此一个常用的技巧是使用一个,以便创建不可变的对象,您将实际在其上执行搜索。请注意,这不需

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

但是,只要我想在ExecuterService中使用多个线程,它们都将在同一个图上计算结果,这当然会使结果无法使用

如何使一个线程获得自己的图形副本,以便在该线程上运行的可调用项不会干扰其他线程?这可能吗?

因为,您需要定义一种机制来复制您已有的单个图形数据结构。但是,由于在创建结构的多个副本之前,显然需要首先构建结构本身,因此一个常用的技巧是使用一个,以便创建不可变的对象,您将实际在其上执行搜索。请注意,这不需要在实际的单独类(例如
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
(例如,在可变版本中使用基于
Map
的存储时,通过其各自的ID将
Edge
对象存储在一个数组中,以实现内存高效存储)。这样,对于程序员和计算机来说,为两个特定任务创建两个单独的类可能会更快。

只需为您的图形提供一个适当的复制方法,并让其他线程在复制的图形上工作。我如何告诉不同的可调用函数应该在哪个图形上运行?这取决于它们运行的线程是哪个n、 你能提供一些简短的代码吗?我不知道你想做什么。这是关于Java并发API的问题还是关于你自己制作的图形结构的问题?@Reyny:如果这个答案对你有帮助,我将非常感谢你,因为我目前正在寻找一些额外的信誉点。另外,它也会给你一些额外的积分,t哦,非常感谢你的帮助。