我有一个单独的线程需要请求一些可能在此期间在JavaFX线程内发生变化的数据。我想在这个单独的线程中执行一个阻塞调用,以确保请求被引入JavaFX线程。
Swing-GUI测试框架AssertJ为此提供了一个易于使用的API:
List list = GuiActionRunner.execute(new GuiQuery<...>...);
调用阻塞当前线程,在事件调度线程中执行传递的代码并返回所需的数据。
如何在JavaFX应用程序的生产代码中实现这一点?这个要求的推荐方法是什么?
答案 0 :(得分:5)
这是使用FutureTask
的替代解决方案。这避免了显式锁存和管理AtomicReference
中的同步数据。这里的代码可能很简单,它会在Platform
冗余中包含此功能。
FutureTask<List<?>> task = new FutureTask<>( () -> {
List<?> data = ... ; // access data
return data ;
});
Platform.runLater(task);
List<?> data = task.get();
如果你想要pause a background thread to await user input,这项技术非常有用。
答案 1 :(得分:1)
好的,我想我现在知道了。你需要自己实现这样的东西:
AtomicReference<List<?>> r = new AtomicReference<>();
CountDownLatch l = new CountDownLatch(1);
Platform.runLater( () -> {
// access data
r.set(...)
l.countDown();
})
l.await();
System.err.println(r.get());