example clase java multithreading lambda java-8 method-reference

java - clase - ¿Por qué se ejecuta invokeLater en el hilo principal?



clase swingworker (2)

Esto no está relacionado con Swing, es lo que sucede cuando se usan referencias de métodos y lambdas detrás de las escenas.

Un ejemplo más simple:

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; } }

Obtendrá un único resultado init aquí; Observe que no hay operación de terminal para la transmisión.

Acabo de encontrar este "error", pero no estoy seguro de si esto es así: Código:

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 }

En el primer ejemplo, someMethod se está ejecutando en el subproceso swing, pero en el segundo ejemplo no lo está, aunque debería ser en mi opinión.

¿Es esto un error o es esto intencional?


Para mí, parece un malentendido de tu parte

La primera línea es como decir: "Ok, Swing, lo que quiero que invokeLater es someMethod().toString() ". Entonces Swing lo ejecuta

La segunda línea es como decir: "Ok, Swing, lo que quiero que invokeLater es el método toString() del objeto devuelto por el método someMethod() ". Un método someMethod() que estoy ejecutando en este momento

Entonces el resultado es completamente lógico para mí

Solo tenga en cuenta que antes de evaluar una función (en este caso invokeLater ) Java necesita evaluar todos los argumentos. Entonces, en el primer caso, Java evalúa una función lambda (no es necesario ejecutarla) y en el segundo caso encuentra una invocación al método, por lo que necesita ejecutarla