ExecutorService vs Swing Timer
Domanda
Di recente ho letto Filthy Rich Clients e ho notato che, sebbene la versione di Java sia 6, lì non fa menzione del Concurrent Framework. Quindi, parlano di java.util.Timer e javax.swing.Timer ma non dell'ExecutorService.
Ho letto i vantaggi di ExecutorService nella domanda " Java Timer vs ExecutorService " ; e ho deciso di utilizzare il secondo rispetto al primo. Ma il libro parla di javax.swing.Timer ed è vantaggi di essere specifici per lo sviluppo di Swing.
Quindi, questo significa che, per lo sviluppo di Swing (pulsanti animati ecc.), javax.swing.Timer è ancora una scelta migliore o esiste una classe rilevante nel nuovo Concurrent Framework che lo sostituisce?
Soluzione
Bene, lo Swing Timer funziona almeno sull'EDT, quindi non è necessario avvolgere tutto con le chiamate per invocare in ritardo. Si collega bene anche a Swing poiché utilizza Actions, ActionListeners e altre classi correlate a Swing.
Continuerei con le attività correlate a Swing Timer per Swing e utilizzerei il nuovo pacchetto simultaneo per cose che non comportano l'aggiornamento della GUI.
Dai un'occhiata a Uso dei timer nelle applicazioni Swing potrebbe contenere più informazioni per oscillare (scusate) la decisione.
Altri suggerimenti
Direi che per cose semplici legate allo swing la scelta migliore è il javax.swing.Timer
a causa dei vantaggi menzionati qui .
Nota che il compito del timer Swing è eseguita nell'invio dell'evento filo. Ciò significa che l'attività può manipolare in modo sicuro i componenti, ma esso significa anche che l'attività dovrebbe eseguire rapidamente.
D'altra parte, se è necessario eseguire operazioni di elaborazione non swing o più complesse / lunghe, ExecutorService
è molto robusto ed è sicuramente la strada da percorrere.
Solo un suggerimento che elabora ciò che Bruno ha consigliato, uno schema per trarre vantaggio dalle eccellenti utility di concorrenza Java 1.5+ senza interrompere Swing è che il tuo ExecutorService
faccia tutto il lavoro pesante (come diceva bruno) ma una volta fatto, il thread ExecutorService
dovrebbe trasferire l'interazione con i componenti dell'interfaccia utente effettivi al thread AWT in un Runnable usando uno di:
-
javax.swing.SwingUtilities.invokeAndWait (Runnable doRun)
-
javax.swing.SwingUtilities.invokeLater (Runnable doRun)
Questi metodi passano il runnable per essere eseguito dal thread AWT.