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)上执行代码。
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)上执行代码。