single-thread-modello e EDT
La maggior parte delle moderne librerie UI adottano la single-thread-model
.Ciò significa che tutta la manipolazione delle componenti dell'interfaccia utente DEVE essere eseguita sullo stesso thread singolo. Perché? Questo perché consentire l'aggiornamento dei componenti dell'interfaccia utente da più thread porterà al caos dal most Swing object methods are not "thread safe". Per semplicità, efficienza e robustezza, viene adottato il modello a thread singolo.
In Swing, il thread che serve lo single-thread-model
è chiamato Event Dispatching Thread, cioè EDT. Non è fornito da Swing. È fornito da Abstract Window Toolkit, ad esempio AWT.
Thread di lavoro vs UI filo
Un'applicazione GUI non banale di solito ha molti fili. Nella moderna applicazione GUI, ci possono essere molti thread di lavoro per fare lavori sporchi, ma c'è solo un thread di interfaccia utente (Swing chiama EDT) per aggiornare la GUI. I thread di lavoro di solito devono riflettere i loro progressi di lavoro nella GUI, quindi hanno bisogno di comunicare con il thread dell'interfaccia in merito. Quindi, come avviene questa comunicazione?
java.awt.EventQueue
La comunicazione avviene attraverso un modello di coda di messaggi. Lo java.awt.EventQueue
è la classe che fornisce una coda eventi a livello globale. Questa coda eventi globale funge da canale di comunicazione per EDT. EDT preleva i messaggi da questo EventQueue e aggiorna i componenti UI di conseguenza. Se qualche altra parte del programma desidera modificare l'interfaccia utente, quella parte di codice deve chiamare EventQueue.invokeLater()
o EventQueue.invokeAndWait()
per accodare un messaggio in EventQueue. EDT elaborerà tutti i messaggi in sospeso in EventQueue e alla fine arriverà al messaggio.
il thread principale
tuo frammento di codice di solito risiede nel thread main()
, il filo main
può essere visto come una specie di worker thread
qui. Solo che invece di aggiornare la GUI inviando messaggi a EventQueue, avvia la GUI. Ad ogni modo, l'iniziazione può essere vista come una specie di lavoro, anche.
Dopo l'avvio della GUI, il thread principale verrà chiuso e l'EDT impedirà l'uscita del processo.
E un'altra buona spiegazione:
Java Event-Dispatching Thread explanation
Un interessante articolo: Multi-threaded toolkit, a failed dream?
hai fatto un buon lavoro e io sono chiaro con questi concetti ora !! grazie .. – Deepak
E cosa succederebbe se lo mettessi nel metodo principale, senza alcun involucro? 'public static void main (String args []) {New JFrame(). SetVisible (true);}' – Martin
@Martin: Quindi si infrange la regola che il codice che interessa l'interfaccia utente deve essere eseguito nel thread di invio dell'evento. Questo potrebbe accadere per funzionare (la maggior parte delle volte), ma potrebbe anche causare una serie di errori relativi alle condizioni di gara, ecc. È difficile prevedere cosa potrebbe accadere. Forse incappi in errori di disegno, forse no. – yankee