Why does invokeLater execute in the main thread? Why does invokeLater execute in the main thread? multithreading multithreading

Why does invokeLater execute in the main thread?


To me it seems like a misunderstanding on your side

The first line is like saying: "Ok, Swing, what I want you to invokeLater is someMethod().toString()". So Swing executes it

The second line is like saying: "Ok, Swing, what I want you to invokeLater is the method toString() of the object returned by the method someMethod()". A someMethod() method that I am executing right now

So the result is completely logical to me

Just keep in mind that before evaluating a function (in this case invokeLater) Java needs to evaluate all arguments. So in the first case Java evaluate a lambda function (no need to execute it) and in the second case it encounters a method invocation so it needs to execute it


This is not related to Swing, it's what happens when using method references and lambdas behind the scenes.

A simpler example:

public static void main(String[] args) {    Stream.of(1, 2, 3).map(initMapper()::inc);    Stream.of(1, 2, 3).map(x -> initMapper().inc(x));}private static Mapper initMapper() {    System.out.println("init");    return new Mapper();}static class Mapper {    public int inc(int x) {        return x + 1;    }}

You will get a single init output here; notice that there is no terminal operation for the stream.