从不同的线程同步请求JavaFX线程内的数据

时间:2015-01-01 11:54:06

标签: multithreading javafx synchronization

我有一个单独的线程需要请求一些可能在此期间在JavaFX线程内发生变化的数据。我想在这个单独的线程中执行一个阻塞调用,以确保请求被引入JavaFX线程。

Swing-GUI测试框架AssertJ为此提供了一个易于使用的API:

List list = GuiActionRunner.execute(new GuiQuery<...>...);

调用阻塞当前线程,在事件调度线程中执行传递的代码并返回所需的数据。

如何在JavaFX应用程序的生产代码中实现这一点?这个要求的推荐方法是什么?

2 个答案:

答案 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());