当前位置: 首页 > 知识库问答 >
问题:

CompletableFuture等待来自UI线程的UI线程?

淳于熙云
2023-03-14

Java 8的promise实现,即CompletableFuture,提供了应用(…)和get()方法。

其中,get()在必要时等待promise完成,然后返回其结果。

现在假设我们使用thenApply(…)(或thenApplyAsync(…))链接一些代码以在UI线程上运行(请参见stackoverflow.com/thenApply和thenApplyAsync之间的差异)。

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

我之前使用的是Qt框架,根据我们实现WAERER的方式(调度UI事件与睡眠),可以在同一个UI线程内等待UI线程(例如,整个视图恢复到活动状态,而不从代码返回)<但是我不确定Java是否支持这一点。

共有1个答案

孙佐
2023-03-14

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

与Qt不同,Java不支持手动处理UI事件,这意味着一旦您在UI线程上等待,就无法在UI线程上运行其他任何东西(直到服务员返回)。

此外,不要使用“thenApply(…)”方法在UI线程上运行东西,因为有更好的解决方案,我的意思是使用以执行器作为参数的应用同步(…)版本。所述执行器是一个功能接口,具有一种方法,即void execute(Runnable命令)。您可以使用事件队列::invokeLater(或其包装器SwingUtilities.invokeLater)来实现这一点。然后,它将在事件调度程序线程(也称为UI线程)上执行代码

 类似资料:
  • 可能重复: Android:线程中的吐司 我从一个工作线程中调用一个帮助器类函数,其中我试图引发一个toast,但是我得到了下面的异常 我们不能从非 UI 线程中举杯庆祝吗?

  • 首先,我决定让我的类阻塞(让消费者更容易使用,但对我来说可能更乏味)。而不是让使用者定义异步回调。这是一个好的设计模式吗?这样,用户可以获得预期的行为,但如果他们对线程被阻塞的时间不满意,则可以实现自己的多线程。 我有一个构造函数,它根据异步回调的结果在类中设置最后一个字段: 这不起作用,所以我使用了原子引用,并实现了一个阻塞循环,直到返回结果,如下所示: 这是阻止/检索结果的好方法吗?

  • 问题内容: 我正在为我的ubuntu服务器(针对我的多客户端匿名聊天程序)实现一种简单的线程池机制,并且需要使我的工作线程进入睡眠状态,直到需要执行一项工作(以函数指针和参数的形式) 。 我当前的系统即将关闭。我(工人线程正在)问经理是否有工作可用,以及是否有5毫秒没有睡眠。如果存在,请将作业添加到工作队列中并运行该函数。糟糕的循环浪费。 什么我 喜欢 做的是做一个简单的事件性的系统。我正在考虑有

  • 我有两个交织在一起的多线程问题。 我在使用spring boot的JavaFX桌面应用程序中有一个SplitPane。左边是树视图,右边是选项卡窗格。开始时,SplitPane设备位于右侧边缘,隐藏了TabPane。当用户在树中选择一个项目时,两件事将同时发生: 首先,根据选择,创建10个选项卡。选项卡因所选对象而异。每个选项卡都显示与选定对象相关的详细数据。大多数选项卡包含图表,但也包含文本。

  • 问题内容: 我有以下情况: 为了运行算法,我必须运行多个线程,并且每个线程都会在死之前设置一个实例变量x。问题是这些线程不会立即返回: 我应该使用等待通知吗?还是我应该嵌入一个while循环并检查是否终止? 感谢大家! 问题答案: 创建一些共享存储来保存每个线程的值,或者如果足够的话,只存储总和。使用a 等待线程终止。每个线程完成后都会调用,您的方法将使用该方法来等待它们。 编辑: 这是我建议的方

  • 问题内容: 我有一个线程类“ MyThread”和主应用程序,简称为“ Gui”。我想从线程类创建一些对象,但在本示例中,我仅创建了一个对象。线程类完成一些工作,然后向Gui类发出信号,指示需要用户输入(此指示目前仅是更改按钮的文本)。然后,线程应等待用户输入(在这种情况下为单击按钮),然后继续执行其操作… 如何在(多个)线程中等待用户输入? 问题答案: 默认情况下,具有事件循环,可以处理信号和插