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

标签 java multithreading lambda java-8 method-reference

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

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 线程上执行的,但在第二个示例中不是,尽管我认为应该如此。

这是一个错误还是有意为之?

最佳答案

对我来说,这似乎是对你的误解

第一行就像是在说:“好的,Swing,我希望你 invokeLatersomeMethod().toString()”。所以 Swing 执行它

第二行就像在说:“好吧,Swing,我要你invokeLater是方法返回的对象的方法toString() >someMethod()”。 我现在正在执行的 someMethod() 方法

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

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

关于java - 为什么invokeLater在主线程中执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44543465/

相关文章:

java - Kotlin 如何与 Java 和 JavaScript 互操作?

java - 使用 Maven 安装全局安装的 Bower 组件

java - 每当我注销服务器时命令就会停止

java - 只能进入第一个线程,不能进入后续线程

c# - 调用 `ObjectDisposedException` 时避免 `Invoke`

java - 我收到一个表示错误的错误:不是封闭的类:仪表板

multithreading - atomic.Load 和atomic.Store 的意义是什么

lambda - 根本没有调用 lambda 函数中的代码

QThread 和 C++11 lambda : wait for finished

Java 8 流 : Analyze same list elements