首页 文章

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

提问于
浏览
0

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

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

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

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

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

2 回答

  • 5

    好吧我想我现在明白了 . 你需要自己实现这样的东西:

    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());
    
  • 1

    这是一个替代解决方案,使用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,这项技术非常有用 .

相关问题