Как приостановить JUNG "аниматор" (учитывая IterativeProcess) с помощью Thread Sleep?

Я реализую интерфейс библиотеки JUNG для перемещения agents(которые являются узлами JUNG) между узлами.

Когда я командую agent чтобы перейти от узла 1 к узлу 2, и до того, как поездка агента к узлу 2 закончилась, я командую agent перейти к узлу 1.

Я хочу agent перейти к узлу 1 после достижения узла 2 Но вместо этого агент получает slowed down (Потому что новая команда уменьшает свою скорость) и когда достигает узла 2 с этой уменьшенной скоростью, она возвращается к узлу 1 с той же уменьшенной скоростью.

И когда есть Third узел, на который агенту приказано переместиться (когда он находится в узле формы командировки 1 на узел 2) агенту looses its path к узлу 2 и не достигает ни одного из узлов 2 или 3.

Я знаю, что это происходит потому, что, когда некоторые thread является moving the agent другой поток, который выполняет новую команду, должен как-то стать paused и после другого thread заканчивает свою работу так и должно быть resumed,

Я пытался сделать такую ​​вещь, спя потоком, но это не работает.

Кажется, даже когда я сплю потоком, вершинный коллайдер продолжает менять расположение узла. Я также пытался использовать semaphores но происходит то же самое.

Как я могу остановить это полностью?

Вот полная реализация моего кода (The main part for moving the agents is the MOVE class):

InterpretMaster.java

commandMaster.java

Command.java

Move.java:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package interpreter.command;
import GraphHandling.BehGraphUndirected;
import edu.uci.ics.jung.algorithms.layout.AbstractLayout;
import edu.uci.ics.jung.algorithms.util.IterativeProcess;
import edu.uci.ics.jung.visualization.VisualizationImageServer;
import edu.uci.ics.jung.visualization.VisualizationViewer;
import edu.uci.ics.jung.algorithms.layout.ISOMLayout;
import edu.uci.ics.jung.algorithms.layout.Layout;
import edu.uci.ics.jung.visualization.util.Animator;
import interpreter.Command;
import interpreter.CommandMaster;
import interpreter.InterpretMaster;
import java.awt.geom.Point2D;
import java.util.LinkedList;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Administrator
 */
public class Move extends Command{

    private CommandMaster cm;
    private BehGraphUndirected behGraph;
    private static String lastAgent = "";

    @Override
    public Object run(BehGraphUndirected behGraph, VisualizationImageServer panel, InterpretMaster interpretMaster,LinkedList<String> nodeList,LinkedList<InterpretMaster.nodeAttribute> nodeAttributes,AbstractLayout <String, String> layout, String... args) {
        System.out.print("move Runs\n");
        this.cm = new CommandMaster();
        this.behGraph = behGraph;
        //AbstractLayout <String, String> moveLayout;

        if(cm.exists(args[0]))
        {
            //got to another command
        }
        else
        {
            switch (args[0]) 
            {
                case "agent":
                    int size=nodeAttributes.size();
                    int i;
                    for(i=0;i<size;i++)
                    {
                        if(args[1].equals(nodeAttributes.get(i).nodeName))
                        {
                            if(nodeAttributes.get(i).isMoving)
                            {

                                try {
                                    Thread.sleep(10000);
                                } catch (InterruptedException ex) {
                                    Logger.getLogger(Move.class.getName()).log(Level.SEVERE, null, ex);
                                }
                            }
                            VertexCollider vtxCol = new VertexCollider(layout, panel,args[1], args[2] , args[1] , nodeAttributes.get(i));
                            vtxCol.setMaximumIterations(1000);
                            vtxCol.setDesiredPrecision(1);
                            vtxCol.initialize();
                            Animator animator = new Animator(vtxCol);
                            animator.start();
                            nodeAttributes.get(i).isMoving = true;
                            break;  
                        }
                    }
                    break;
            }
        }
        interpretMaster.repaint();
        return null; 
    }


    class  VertexCollider extends IterativeProcess
    {
        private String COLLIDER;
        private AbstractLayout<String, String> layout;
        private VisualizationImageServer<String, String> vv;
        private Point2D startLocation;
        private Point2D endLocation;
        private Double moveX;
        private Double moveY;
        private InterpretMaster.nodeAttribute agentAttributes;

        public VertexCollider(AbstractLayout<String, String> layout, VisualizationImageServer <String, String> vv, String vertexA, String vertexB , String collider , InterpretMaster.nodeAttribute nodeAttributes) {

            this.layout = layout;
            this.vv = vv;
            startLocation = layout.transform(vertexA);
            endLocation = layout.transform(vertexB);
            COLLIDER = collider;
            agentAttributes = nodeAttributes;

        }

        public void initialize() {
            setPrecision(Double.MAX_VALUE);
            //layout.setLocation(COLLIDER, startLocation);
            moveX = (endLocation.getX() - startLocation.getX()) / getMaximumIterations();
            moveY = (endLocation.getY() - startLocation.getY()) / getMaximumIterations();
        }

        @Override
        public void step() {
            layout.setLocation(COLLIDER, layout.getX(COLLIDER) + moveX, layout.getY(COLLIDER) + moveY);
            vv.repaint();
            setPrecision(Math.max(Math.abs(endLocation.getX() - layout.transform(COLLIDER).getX()),
                Math.abs(endLocation.getY() - layout.transform(COLLIDER).getY())));
            if (hasConverged()){
                //layout.getGraph().removeVertex(COLLIDER);
                agentAttributes.isMoving = false;
                System.out.println("reached");


            }
        }
    }
}

Create.java

0 ответов

Другие вопросы по тегам