Tutto ciò che viene chiamato dal
public static void main(String[] agrs) {
direttamente (senza deposizione delle uova un altro thread o utilizzando invokeLater) è in esecuzione sul thread principale.
L'accesso agli oggetti GUI con il thread principale mentre è possibile che si acceda (simultaneamente) dall'EDT (che viene attivato dall'input dell'utente) può causare problemi di threading. Chiamando invokeLater, le attività (eseguibili) vengono eseguite sull'EDT, impedendo l'accesso simultaneo da parte di altre attività EDT, ad es. pressioni dei pulsanti, ecc.
Se si è certi che EDT non è occupato (prima che la prima finestra sia impostata su SetVisible (true)) è possibile accedere alla GUI dal thread principale. Se si può essere sicuri che EDT non abbia alcun riferimento al componente su cui si sta lavorando (è fuori dall'ambito di EDT) vale a dire. prima di essere aggiunto a qualsiasi contenitore, è possibile accedervi dal thread principale senza che l'EDT lo acceda contemporaneamente, poiché l'EDT non ha modo di raggiungerlo.
fonte
2011-12-31 11:46:57
Quando non sono in esecuzione sotto EDT? Quindi cosa intendi se faccio un thread per cambiare qualcosa dovrei eseguirlo con uno di questi metodi giusto? Ma non sto facendo un altro thread, sto solo correndo sul thread predefinito giusto? Quindi non renderebbe setVisible in invokeAndWait inutile? –
Se lo si sta eseguendo sul thread "predefinito" (principale), allora * non * è in EDT. – Darkhogg
Dai uno sguardo ai link nella risposta di @ Robin. Il thread principale non è lo stesso del thread EDT, ma spesso il codice che stai usando con Swing è codice per gestire un evento e quindi su EDT. –