当前位置: 首页 > 面试题库 >

为什么invokeLater在主线程中执行?

夏知
2023-03-14
问题内容

我刚刚遇到了这个“错误”,但是我不确定这是否是故意的:代码:

public static Object someMethod(){
    assert SwingUtilities.isEventDispatchThread();
    return new Object();
}

public static void main(String[] args){
    SwingUtilities.invokeLater(() -> someMethod().toString());//First Example
    SwingUtilities.invokeLater(someMethod()::toString);//Second Example
}

在第一个示例中,someMethod它是在swing线程上执行的,但在第二个示例中,它不是,尽管我认为应该这样做。

这是错误还是故意的?


问题答案:

在我看来,这似乎是您的误解

第一行就像在说:“好吧,秋千,我想要你做的invokeLatersomeMethod().toString()”。所以Swing执行它

第二行就像是说:“确定,Swing,我要您执行的invokeLater是方法toString()返回的对象的方法someMethod()”。一个someMethod()是方法,
我现在执行

所以结果对我来说完全合乎逻辑

请记住,在评估函数(在本例中为invokeLater)之前,Java需要评估所有参数。因此,在第一种情况下,Java评估lambda函数(无需执行),在第二种情况下,它遇到方法调用,
因此需要执行它



 类似资料:
  • 我很难理解内部类线程的行为。 它总是打印出“main”,并且线程是按顺序执行的。为什么内部类线程的执行由主线程执行? 谢谢!

  • 在下面的代码中,为什么主线程要等到子线程完成。 Driver.java ThreadRunner.java 调用“t.start()”后,在驱动程序类中,程序是否应该退出?我没有使用join,但主线程仍在等待,直到新旋转的“ThreadRunner”运行开始。这是因为在java中,主线程(由main方法启动)总是等待所有线程关闭吗?

  • 问题内容: 我最近找到了一个示例代码: 该方法将打开一个用户界面窗口。然后,我尝试将代码修剪如下: 两种版本均能正常工作。有什么区别? 问题答案: 任何一种代码都能在99%的时间内工作。 但是,Swing的设计使得对Swing组件的所有更新都应在事件分发线程(EDT)上完成。阅读有关并发的Swing教程以获取更多信息。 问题是它有1%的时间可能无法正常工作。您不想浪费时间尝试调试随机问题。

  • 环境: java21 问题: methods5不会输出log.info的内容, methods6正常打印log.info的内容

  • 我不明白为什么webclient会阻止我使用gradle的主要netty线程,以下是它的依赖项: 这个gradle脚本在两个应用程序中都使用。在第一个应用程序中,我执行: 第二个应用程序模拟长响应处理: 我希望呼叫服务不会阻塞主线程,而是会继续处理传入的连接,但直到我收到第一个呼叫的响应(睡眠将起作用),我的下一个连接将挂起等待。 结果:第一个应用程序像tomcat一样工作,只有一个线程 我的问题

  • 本文向大家介绍iOS 在主线程上执行,包括了iOS 在主线程上执行的使用技巧和注意事项,需要的朋友参考一下 示例 当异步执行任务时,通常需要确保在主线程上运行一段代码。例如,您可能要异步访问REST API,但将结果放在屏幕上的UILabel中。在更新UILabel之前,必须确保您的代码在主线程上运行: 每当您更新屏幕上的视图时,请始终确保您正在主线程上执行此操作,否则可能会发生未定义的行为。