¿Cuáles son las ventajas de usar SwingWorker
en lugar de Thread
o Runnable
?¿Por qué SwingWorker? ¿Por qué no solo Thread o Runnable?
Respuesta
Thread y Runnable formaban parte de Java 1.0; son tan buenos como lo eran en ese entonces.
Las nuevas clases de concurrencia destilan todo lo que se ha aprendido sobre multi-threading desde entonces (gracias, Doug Lea y otros). Escribir código multiproceso es terriblemente difícil. Las nuevas clases de concurrencia, incluido SwingWorker, intentan hacer eso más fácil.
Comience anotando los genéricos para una escritura fuerte. Hay un mecanismo incorporado para publicar y procesar resultados finales e intermedios.
Sería posible imitar esto con Thread y Runnable, pero SwingWorker lo ha hecho por usted.
SwingWorker se ocupa de algunos detalles, como actualizaciones de la interfaz de usuario mientras se ejecuta la tarea o una vez que finaliza la tarea. Deben ejecutarse en el hilo Swing EDT. Puedes hacerlo tú mismo, pero es muy fácil hacerlo mal.
creo que la documentación de la SwingWorker es bastante bueno:
Una clase abstracta para realizar tareas largas interfaz gráfica de usuario que interactúa en un hilo dedicado.
Al escribir una aplicación mediante oscilación multi-hilo, hay dos restricciones a tener en cuenta: (se refiere a How to Use Threads para más detalles):
- tareas que consumen mucho tiempo no se deben ejecutar en el hilo de envío del evento. De lo contrario, la aplicación se vuelve que no responde.
- Se debe tener acceso a los componentes Swing solo en la secuencia de envío de eventos .
Estas restricciones significan que un aplicación GUI con el tiempo intensivo necesidades informáticas al menos dos hilos: 1) un hilo para realizar el largo tarea y 2) el hilo de eventos Despacho (EDT) para todos GUI -actividades relacionadas. Esto implica la comunicación entre hilos que puede ser difícil de implementar en .
SwingWorker está diseñado para situaciones donde se necesita para tener una larga carrera tarea en un subproceso en segundo plano y al día a la interfaz de usuario, ya sea cuando hecho, o al procesar. Las subclases de SwingWorker deben implementar el método doInBackground() para realizar el cálculo de fondo .
seguramente usted puede hacer esto utilizando hilo, tiempo de ejecución y SwingUtilities (invokeLater
) pero es más fácil y, probablemente, menos propenso a errores utilizando la clase SwingWorker.
SwingWorker
encapsula la interacción correcta con el hilo de envío de eventos. Runnable
no.
- 1. ¿Por qué no se puede incrustar Runnable en un subproceso?
- 2. ¿Por qué no Thread implement IDisposable?
- 3. Implementando Runnable vs. extended Thread
- 4. ¿Cómo acceder a un objeto Runnable por Thread?
- 5. ¿Por qué UncaughtExceptionHandler no es llamado por ExecutorService?
- 6. ¿Qué es más recomendable para crear un hilo extendiendo una clase Thread o implementando Runnable?
- 7. Por qué solo una clase por archivo
- 8. ¿Qué significa "apachectl"? ¿Por qué no es solo "apache"?
- 9. ¿Qué significa "solo exposición"? ¿Por qué usarlo?
- 10. ¿Por qué no está LinkedList.Clear() O (1)
- 11. ¿Por qué se ejecuta run() solo una vez?
- 12. ¿Por qué es CurrentCulture una propiedad de Thread?
- 13. Mecanografía implícita; ¿por qué solo variables locales?
- 14. ¿por qué jvm tiene muchos clasloaders? ¿por qué no uno?
- 15. ¿Por qué concurrent_queue no bloquea?
- 16. por qué setName en la clase Thread asigna a una matriz de caracteres? ¿Por qué no una cadena?
- 17. ¿Por qué los programas no solo matan y reinician explorer.exe?
- 18. C - ¿Por qué imprimir y no solo imprimir?
- 19. ¿Por qué Request.QueryString es solo de lectura?
- 20. ¿Por qué python super no acepta solo la instancia?
- 21. ¿Por qué Class.newInstance() "evil"?
- 22. por qué autoimport solo el paquete java.lang?
- 23. ¿Por qué hay solo cuatro registros?
- 24. ¿Por qué este código solo imprime 42?
- 25. ¿Por qué la clase java.lang.Thread en Java no está marcada como definitiva por los diseñadores?
- 26. ¿Por qué las propiedades no pueden ser de solo lectura?
- 27. ¿Por qué solo se agrega una vez?
- 28. ¿Por qué PLINQ usa solo dos hilos?
- 29. Page.ClientScript.RegisterStartupScript no funciona, ¿por qué?
- 30. ¿Cómo obtengo el valor devuelto por el método Thread Runnable interno en Java?
¿SwingWorker es realmente parte de las nuevas clases de concurrencia? Creo que es parte de la API de Swing y la razón principal para usarla es debido a las limitaciones con respecto al Tema de envío de evento (EDT). –
No forma parte del paquete de simultaneidad, pero lo consideraría con el mismo espíritu. Podría estar equivocado – duffymo
Sí, pero básicamente es un futuro, ¡así que está todo bien! – HaveAGuess