Domanda

Ho integrato l'aspetto Sostanza nella mia applicazione e ho riscontrato diversi problemi riguardanti sono le routine interne di controllo EDT (Event Dispatch Thread). La sostanza rifiuta assolutamente di costruire classi dell'interfaccia utente al di fuori dell'EDT. Ho fatto un sacco di Swing / AWT e conosco la maggior parte delle regole relative all'EDT. Uso SwingWorker, SwingUtilties.invokeLater per modificare i componenti. Ho sempre pensato che i componenti potrebbero essere STRUTTURATI al di fuori dell'EDT, ma devono essere realizzati e < em> manipolato sull'EDT. In altre parole, è possibile costruire e configurare i valori predefiniti in background, ma la chiamata a pack / setVisible deve essere EDT e qualsiasi chiamata successiva per manipolare il componente.

Il motivo per cui lo chiedo è che ho un " beefy " finestra da costruire, che coinvolge molti widget, stato e risorse (molte icone). In precedenza, avevo costruito la finestra sul metodo di sfondo di SwingWorker e rendevo visibile la finestra nel metodo fatto. Non ho mai avuto un singolo problema. Al passaggio a sostanza, il controllo EDT interno mi morde.

Sono stato in grado di refactoring del codice per aggirare questo. Posso costruire sull'EDT che non è una buona soluzione poiché l'intera applicazione si bloccherà. Posso anche effettuare il refactoring ancora di più e fare del mio meglio per caricare tutte le risorse extra al di fuori dell'EDT.

In conclusione ... È sicuro costruire i widget Swing / AWT NON sul thread di invio degli eventi?

È stato utile?

Soluzione

Sun ha modificato le regole nel 2004: in precedenza, era possibile creare i componenti al di fuori dell'EDT e si doveva passare all'EDT solo dopo che il componente era stato realizzato .

La nuova regola ora recita:

  

Per evitare la possibilità di deadlock,   devi fare molta attenzione a Swing   componenti e modelli sono creati ,   modificato e interrogato solo da   thread di invio eventi.

questo mio post sul blog fornisce ulteriori dettagli, tra cui collegamenti ad altri articoli correlati. si noti che tutti gli esempi ufficiali di Sun sono stati riscritti e sono molto severi al riguardo.

storicamente, è stata probabilmente la crescente disponibilità di computer multi-core come macchine desktop a motivare la riformulazione della regola - i problemi di threading sono diventati sempre più evidenti nello stack client e essendo molto severi sulle linee guida EDT , molti di essi possono essere prevenuti dall'inizio.

Altri suggerimenti

No.

La semplice ragione è che anche all'EDT piace in alcuni rari casi deadlock e in generale è facile bloccare l'interfaccia utente quando si utilizza Swing ( o almeno così mi è stato detto ). Ti suggerisco di leggere questi tre articoli dal blog di Kirill (lo sviluppatore della sostanza):

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top