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?

È stato utile?

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.

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