一尘不染

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

java

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

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

这是错误还是故意的?


阅读 180

收藏
2020-12-03

共1个答案

一尘不染

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

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

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

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

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

2020-12-03