0

У меня есть рабочий код, в котором я вычисляю кратчайший путь из каждой точки (алгоритм Дейкстры) в каждую точку графа.Позволяет callables/threads работать с копией объекта в Java

Но как только я хочу использовать более 1 потока с моим ExecuterService, все они будут работать на одном и том же графике для вычисления результатов, что, конечно, делает результат непригодным.

Как это сделать, чтобы один поток получал собственную копию графика, поэтому вызывающие вызовы, запущенные на этом потоке, не будут беспокоить других? Возможно ли это?

+1

просто предоставьте правильный метод копирования для своего графика и позвольте другим потокам работать с скопированным графиком. –

+0

Как определить разные вызовы, на которых они должны работать? Это зависит от того, какая нить работает. – Reyny

+0

Можете ли вы предоставить короткий код? Я не уверен, что вы пытаетесь сделать. –

ответ

0

Как 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 объектов по их идентификаторам в массиве для хранения с высокой эффективностью хранения при использовании хранилища Map в изменяемой версии). Таким образом, создание двух отдельных классов для двух конкретных задач может быть быстрее для программиста, а также для компьютера.

+0

@Reyny: Если бы этот ответ помог вам, я был бы очень благодарен, если бы вы [приняли его] (https://stackoverflow.com/help/accepted-answer), поскольку я в настоящее время травляю за несколько лишних репутаций точки. Кроме того, это также дает вам несколько дополнительных очков. Большое спасибо за помощь. – errantlinguist