Как приостановить 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)
:
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");
}
}
}
}