Ho un paio di domande riguardo a Swing e utilizzo di EDT per gli aggiornamenti della GUI. Ho appena iniziato a leggere su questa roba quindi sono un principiante assoluto in quest'area:Java Swing - in esecuzione su EDT
- Quali operazioni sono necessarie per l'esecuzione su EDT? Se non lo fanno, è semplicemente un'eccezione sollevata?
- Ci sono dei momenti specifici in cui siamo effettivamente nell'EDT automaticamente?
- se pianifichiamo un'attività utilizzando
SingUtilities.invokeLater
, la accodiamo alla coda corrente delle attività di aggiornamento della GUI, giusto? - Gli accessi alla coda precedente sono sincronizzati o viene utilizzata una raccolta simultanea, ma se pianifico due attività di aggiornamento della GUI, da due thread in background, è impossibile stabilire quale verrà aggiunto per primo? Ad esempio, se Thread 1 FIRST invia un'attività di impostare il testo di un JLable su "sì", e quindi, poco tempo dopo, il secondo thread arriva e invia l'attività di impostare quel valore su "no", siamo sicuri che il risultato sarà "sì", o è semplicemente una questione di come queste cose sono programmate dal sistema operativo?
In che modo esattamente SwingWorker garantisce che il metodo
done()
venga eseguito su EDT? Si imposta il codice seguente:future = new FutureTask<T>(callable) { @Override protected void done() { doneEDT(); setState(StateValue.DONE); } };
quindi mi chiedevo se FutureTask rende in qualche modo in modo che invokeLater
si chiama?
Grazie per tutte le vostre risposte.
Due domande: 4. Quindi è il primo thread che esegue invocare più tardi, giusto? Quindi può succedere che il sistema operativo pianifichi il secondo thread in background invocando la chiamata FIRST FIRST e l'ordine sarà incasinato? 5. Non riesco ancora a vedere come si raggiunge l'EDT. Invia Invia il Runnable a AccumulativeRunnable ... –
Bober02
@ Bober02 Vedere javax.swing.SwingWorker.DoSubmitAccumulative Runnable eseguibile, che viene eseguito sull'EDT a causa dell'uso del 'Timer' di swing. Per 4: sì, dovrai assicurarti che il tuo thread in background pianifichi il runnable prima che l'altro thread pianifichi il suo eseguibile se vuoi controllare l'ordine – Robin
A un certo punto, tutto ciò che viene inviato a doSubmit() viene eseguito nell'EDT. Non devi preoccuparti di come e dove è stato fatto: questa classe è stata testata e funziona come documentato. –