我正在构建一个Java fx应用程序,并在其自己的线程上有一个while循环,但是该循环不等待Dijkstra方法返回一个数组,我似乎已经通过将线程休眠1000ms和我真的不知道为什么这行得通,但是有没有更好的方法可以让我等待方法完成然后开始下一次迭代?
public class Chasers {
public volatile List<List<Integer>> Path; ///////
volatile int ChaserX;
volatile int ChaserY;
volatile int PlayerX;
volatile int PlayerY;
boolean Continue=true;
volatile int PathSize = 0;
int dir = 5;
volatile int i=0;
Main MainPassed=new Main();
DijkstraSolve PathFinder = new DijkstraSolve();
Task<Void> task = new Task<Void>() {
@Override protected Void call() throws Exception {
while (Continue) {
i = 0;
width = MainPassed.width;
ChaserX = ((int) (PlayerIns.chaser.getCenterX() / width) * width);
ChaserY = ((int) (PlayerIns.chaser.getCenterY() / width) * width);
PlayerX = ((int) (PlayerIns.player.getCenterX() / width) * width);
PlayerY = ((int) (PlayerIns.player.getCenterY() / width) * width);
Path = PathFinder.Dijkstra(ChaserX, ChaserY, PlayerX, PlayerY, MainPassed);//wait for this to return??
PathSize = Path.size() - 1;
}
return null;
}
};
Thread th = new Thread(task);
//th.setDaemon(true);
th.start();
public void MoveChaser(Player PlayerIns){
Timeline timeline = new Timeline(new KeyFrame(Duration.millis(50), new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println(" current path "+Path);
System.out.println("==============================");
}
}));
timeline.setCycleCount(Timeline.INDEFINITE);
timeline.play();
}
}
答案 0 :(得分:1)
您可以使用join()
方法来实现此目的,当从父线程调用该方法时,父线程将等待子线程终止。在th.join()
之后使用th.start()
。您的任务应该在执行这两个命令之间运行。
答案 1 :(得分:1)
您正在忙循环,并可能使UI线程饿死。 您尚未显示如何声明变量。 (而且您使用的是非标准命名约定,这会造成混乱。请不要使用大写字母来命名变量,这样它们看起来就像类。)
也许Path变量(应命名为“ path”)没有声明为volatile?