【发布时间】:2020-01-04 17:28:15
【问题描述】:
我正在构建一个 java fx 应用程序并在其自己的线程上有一个 while 循环,但该循环不等待 Dijkstra 方法返回一个数组,我似乎通过将线程休眠 1000 毫秒和我真的不知道为什么会这样,但有没有更好的方法让我可以等待方法完成然后开始下一次迭代?
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();
}
}
【问题讨论】:
-
Dijkstra()是否也在新线程中运行?如果没有,循环会等待它完成。为什么你认为没有? -
只是在调用它的同一个线程中运行,它只是不断地调用它,尽管它没有完成。
-
永远是真的只是希望它一直在寻找最新的路径。没有说清楚
-
我在下面的评论中看到您正在使用 UI。这可能是问题所在,需要一些时间来更新。循环确实等待
Dijkstra()完成。 -
请提供一个minimal reproducible example 来说明问题。与您的问题无关:请学习 java 命名约定并遵守它们。也就是说:您不得从 fx 应用程序线程修改场景图。
标签: java multithreading loops recursion javafx