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