Java 8的promise实现,即CompletableFuture,提供了应用(…)和get()方法。
其中,get()
在必要时等待promise完成,然后返回其结果。
现在假设我们使用thenApply(…)
(或thenApplyAsync(…)
)链接一些代码以在UI线程上运行(请参见stackoverflow.com/thenApply和thenApplyAsync之间的差异)。
如果我们在UI线程中调用get()
,比如Java以某种方式处理这种情况,或者它会导致所谓的死锁或无限循环,那么行为是什么?
我之前使用的是Qt框架,根据我们实现WAERER的方式(调度UI事件与睡眠),可以在同一个UI线程内等待UI线程(例如,整个视图恢复到活动状态,而不从代码返回)<但是我不确定Java是否支持这一点。
调用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个选项卡。选项卡因所选对象而异。每个选项卡都显示与选定对象相关的详细数据。大多数选项卡包含图表,但也包含文本。
问题内容: 我有一个线程类“ MyThread”和主应用程序,简称为“ Gui”。我想从线程类创建一些对象,但在本示例中,我仅创建了一个对象。线程类完成一些工作,然后向Gui类发出信号,指示需要用户输入(此指示目前仅是更改按钮的文本)。然后,线程应等待用户输入(在这种情况下为单击按钮),然后继续执行其操作… 如何在(多个)线程中等待用户输入? 问题答案: 默认情况下,具有事件循环,可以处理信号和插
问题内容: 我有以下情况: 为了运行算法,我必须运行多个线程,并且每个线程都会在死之前设置一个实例变量x。问题是这些线程不会立即返回: 我应该使用等待通知吗?还是我应该嵌入一个while循环并检查是否终止? 感谢大家! 问题答案: 创建一些共享存储来保存每个线程的值,或者如果足够的话,只存储总和。使用a 等待线程终止。每个线程完成后都会调用,您的方法将使用该方法来等待它们。 编辑: 这是我建议的方