Java 等待使用闩锁执行Platform.runLater

Java 等待使用闩锁执行Platform.runLater,java,javafx,Java,Javafx,我试图实现的是停止线程并等待调用doSomeProcess()后再继续。但由于某种奇怪的原因,整个过程被困在等待中,它从未进入Runnable.run 代码段: final CountDownLatch latch = new CountDownLatch(1); Platform.runLater(new Runnable() { @Override public void run() { System.out.println("Doing some process");

我试图实现的是停止线程并等待调用doSomeProcess()后再继续。但由于某种奇怪的原因,整个过程被困在等待中,它从未进入Runnable.run

代码段:

final CountDownLatch latch = new CountDownLatch(1); 
Platform.runLater(new Runnable() {
   @Override public void run() { 
     System.out.println("Doing some process");
     doSomeProcess();
     latch.countDown();
   }
});
System.out.println("Await");
latch.await();      
System.out.println("Done");
控制台输出:

Await
不会调用lack.countDown()语句,因为JavaFX线程正在等待调用它;当JavaFX线程从latch.wait()释放时,将调用runnable.run()方法。 我希望这段代码能让事情变得更清楚

    final CountDownLatch latch = new CountDownLatch(1);

    // asynchronous thread doing the process
    new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("Doing some process");
            doSomeProcess(); // I tested with a 5 seconds sleep
            latch.countDown();
        }
    }).start();

    // asynchronous thread waiting for the process to finish
    new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("Await");
            try {
                latch.await();
            } catch (InterruptedException ex) {
                Logger.getLogger(Motores.class.getName()).log(Level.SEVERE, null, ex);
            }
            // queuing the done notification into the javafx thread
            Platform.runLater(new Runnable() {
                @Override
                public void run() {
                    System.out.println("Done");
                }
            });
        }
    }).start();
控制台输出:

    Doing some process
    Await
    Done

您在
doSomeProcess()
之前是否尝试过输出?我猜那个函数不会返回,仅此而已。我已经更新了我的代码片段。它甚至无法到达run方法。是否有东西阻塞了GUI线程?或者你是在GUI线程上执行整个截取?我不确定。我怎么知道它是否在GUI线程上执行?但上面的代码片段是我仅有的一段代码。没别的了,我想这就是问题所在。如果您应该异步执行
doSomeProcess
,那么请在不同的线程上执行。我不太了解JavaFX,也许有某种“AsyncTask”类?