Java 等待使用闩锁执行Platform.runLater
我试图实现的是停止线程并等待调用doSomeProcess()后再继续。但由于某种奇怪的原因,整个过程被困在等待中,它从未进入Runnable.run 代码段: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");
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”类?