CompletableFuture 正在等待来自 UI-thread 的 UI-thread?

CompletableFuture waiting for UI-thread from UI-thread?

Java 8 的 promise 实现,即 CompletableFuture,同时提供了 thenApply(...)get() 方法。

其中 get() 如有必要等待承诺完成,然后 returns 它的结果。


现在假设我们使用 thenApply(...)(或 thenApplyAsync(...))将一些代码链接到 UI-thread
上的 运行 (参见 whosebug.com/)。

如果我们也在 UI 线程中调用 get() 行为是什么,就像 Java 以某种方式处理这种情况一样,还是会导致所谓的死锁或无限循环?


我之前使用的是 Qt 框架,这取决于我们如何实现服务员(dispatch-UI-events vs sleep),可以等待 UI-来自同一个 UI-thread 的线程(例如,整个视图恢复了活动状态,并且没有从我的代码返回)。
但我不确定 Java 是否支持。

调用get() 阻塞当前线程,直到结果可用。如果那是 UI 事件调度程序线程,那么您的应用程序的 UI 将变得无响应(阻塞)。

并且与 Qt 不同,Java 不支持手动处理 UI 事件,这意味着一旦您在 UI-thread 上等待,就没有其他可以在 运行 上 [=25] =](直到服务员 returns)。


此外,不要将“thenApply(...)”方法破解到 UI-thread 上的 运行 东西,因为有更好的解决方案,我的意思是使用 thenApplyAsync(...) 版本它以 Executor 作为参数。说的Executor是一个函数式接口,只有一个方法,void execute(Runnable command)。您可以为此使用 EventQueue::invokeLater(或其包装 SwingUtilities.invokeLater)。然后它将在事件调度程序线程(又名 UI-thread)上执行代码。