Nel mio metodo main(String[] args)
non ho che una chiamata a SwingUtilities.invokeAndWait
per eseguire un metodo main1
sul thread Swing. Ho sempre pensato che ne avessi bisogno per la sicurezza dei thread. Mi è stato detto che non è necessario perché il primo thread per fare qualsiasi codice della GUI diventa il thread della GUI. O per dirla in altro modo, puoi utilizzare Swing solo da un thread, ma non importa quale. Ma non riesco a trovare una fonte per questo e mi piacerebbe essere sicuro.È necessario passare al thread Swing dal metodo principale di un'applicazione?
5
A
risposta
7
Quello che ti è stato detto è falso. Il metodo main
verrà inizialmente chiamato dal thread principale. Tutta l'attività relativa alla GUI deve essere eseguita su un thread completamente separato chiamato Thread di invio eventi. Il thread principale non diventa diventa EDT.
Un bel esempio per vedere di cosa sto parlando:
public class ThreadTest {
public static void main(String[] args) {
final Thread main = Thread.currentThread();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Thread edt = Thread.currentThread();
System.out.println(main);
System.out.println(edt);
System.out.println(main.equals(edt));
}
});
}
}
Sede [Concurrency in Swing: Fili iniziali] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/ initial.html). –
La documentazione di Swing afferma che questo è ciò che dovrebbe essere fatto. Tenderei a crederci, perché mentre ignorando il consiglio potrebbe funzionare il 99,9% delle volte, ha una possibilità di fallire qualche volta, e secondo le leggi dell'universo, questo errore si verificherà solo quando stai dimostrando il tuo programma al tuo più grande cliente o al tuo capo. –
Punto di pedanteria: è un thread AWT. –