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