等待循环内的方法完成,然后再次循环

时间:2019-09-01 07:30:29

标签: java multithreading loops recursion javafx

我正在构建一个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();
}

}

2 个答案:

答案 0 :(得分:1)

您可以使用join()方法来实现此目的,当从父线程调用该方法时,父线程将等待子线程终止。在th.join()之后使用th.start()。您的任务应该在执行这两个命令之间运行。

阅读multithreading basicsJava doc

答案 1 :(得分:1)

您正在忙循环,并可能使UI线程饿死。 您尚未显示如何声明变量。 (而且您使用的是非标准命名约定,这会造成混乱。请不要使用大写字母来命名变量,这样它们看起来就像类。)

也许Path变量(应命名为“ path”)没有声明为volatile?