迪克斯特拉';Java中的s算法-多请求/线程

迪克斯特拉';Java中的s算法-多请求/线程,java,multithreading,web-services,executorservice,dijkstra,Java,Multithreading,Web Services,Executorservice,Dijkstra,我试图在JavaRESTWebService中实现Dijkstra的算法,我使用了link来提供帮助 在此链接中,它仅创建一个图形并成功计算一条路线。但在我的程序中,我创建了多个图,并使用不同的变量作为每个图的成本。然后我使用ExecutorService(总线程数=图形总数)来并行查找所有路径。当我调用程序来测试路径时,我的程序运行良好 问题是,当此算法同时接收多个请求时,它会在printPath()函数中为某些请求返回“unached”消息,并为其他请求成功返回正确的路径。我一个接一个地测试

我试图在JavaRESTWebService中实现Dijkstra的算法,我使用了link来提供帮助

在此链接中,它仅创建一个图形并成功计算一条路线。但在我的程序中,我创建了多个图,并使用不同的变量作为每个图的成本。然后我使用ExecutorService(总线程数=图形总数)来并行查找所有路径。当我调用程序来测试路径时,我的程序运行良好

问题是,当此算法同时接收多个请求时,它会在printPath()函数中为某些请求返回“unached”消息,并为其他请求成功返回正确的路径。我一个接一个地测试了每条路径,它每次都返回正确的路径,没有任何错误。只有当webservice同时接收多个请求时,问题才会发生。下面是我的代码,我只发布了我正在使用的类结构,其余的代码和上面提到的链接相同

以下是我使用ExecutorService查找路径的方式:

List<RouteFutureResult> rfutureResult = new ArrayList();
    executorService = Executors.newFixedThreadPool(graphs.size());//number of threads is equal to number of graphs
    for (final Graph g : graphs) {
        CalcRoutes calcRoutes = new CalcRoutes(g, other_parameters);
        Future<String> submit = executorService.submit(calcRoutes);
        rfutureResult.add(new RouteFutureResult(submit));
    }
    executorService.shutdown();
    executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.MINUTES);
    //reading response from future object
    List<String> st = new ArrayList();
    for (RouteFutureResult resQuery : rfutureResult) {
        String path = resQuery.getFuture().get();
        st.add(path);
    }

我还检查了已经发布的关于Dijkstra算法的问题,但我找不到任何与我的问题相关的问题。不知何故,此算法无法处理多个请求,请指导我,任何帮助都将不胜感激。

您的代码不完整,因此我们无法运行和调试它。我们只能猜测。我假设不同的计算任务使用公共变量,因此相互影响。当您为不同的图创建
MRoute
s时,它们是否对公共顶点或边感兴趣?这些多个图不需要彼此相交,我仅从单个图计算路径,从每个图计算一条路径。我将进一步验证通用变量的用法。还有其他建议吗?
@Override
public String call() throws Exception {
    List<Double> djst = new ArrayList();
    g.dijkstra(s);
    List<Double> st = g.printPath(d, djst);
    //other processing and returning results
}
    class Graph {
    private final Map<Double, Vertex> graph;
    public class Edge {
        public final double v1, v2;
        public final double dist;
    }
    public class Vertex implements Comparable<Vertex> {
        public final double name;
        double gid;
        public double dist = Double.MAX_VALUE;
        public Vertex previous = null;
        public final Map<Vertex, Double> neighbours = new HashMap<>();
        private void printPath(List<Double> st) {
            if (this == this.previous) {
                st.add(this.name);
            } else if (this.previous == null) {
                System.out.printf("%s(unreached)", this.name);//this is where I am getting a problem when service receives multiple requests at same time
            } else {
                this.previous.printPath(st);
                st.add(this.name);
            }
        }
    }
    public Graph(HashMap<Double, RouteResult> edges) {
    }
    public void dijkstra(double startName) {
        if (!graph.containsKey(startName)) {
            System.err.printf("Graph doesn't contain start vertex \"%s\"\n", startName);
            return;
        }
        final Vertex source = graph.get(startName);
        NavigableSet<Vertex> q = new TreeSet<>();
        for (Vertex v : graph.values()) {
            v.previous = v == source ? source : null;
            v.dist = v == source ? 0 : Double.MAX_VALUE;
            q.add(v);
        }
        dijkstra(q);
    }
    private void dijkstra(final NavigableSet<Vertex> q) {
        Vertex u, v;
        while (!q.isEmpty()) {
        }
    }
    public List<Double> printPath(double endName, List<Double> st) {
        if (!graph.containsKey(endName)) {
            System.err.printf("Graph doesn't contain end vertex \"%s\"\n", endName);
        }
        graph.get(endName).printPath(st);
        return st;
    }
}
Graph cost = new Graph(MRoute); //MRoute is the hashmap
graphs.add(cost);//graphs is a list containing multiple graphs