2012-02-10 22 views
7

Estoy en el proceso de diseño de una aplicación guiada por Java que ejecuta una serie de tareas separadas, cada una dentro de su propia clase extendida SwingWorker. Este es el diseño normal que uso para ejecutar tareas en sus propios hilos y aún mantener el EDT libre para actualizar la GUI. Cada SwingWorker se inicia en su propio hilo utilizando un Executors.newCachedThreadPool.Java Swingworker y múltiples hilos

Sin embargo, dentro de una clase particular, hay una tarea que requiere un tiempo bastante largo de procesar. La tarea contiene un bucle for que realiza algunos cálculos hasta seis veces.

He tenido la idea de implementar cada uno de los seis cálculos dentro de su propio hilo para acelerar el tiempo de procesamiento, pero no estoy seguro de la mejor manera de implementar esto.

Es posible extender SwingWorker e implementar Runnable, y luego usar un método Run() vacío dentro del bucle for, iniciar un nuevo Thread cada vez, o usar un cachedThreadPool.

¿O es mejor que solo use la implementación estándar de Thread()?

Cualquier consejo o sugerencia sería apreciada.

Gracias de antemano

Josh

+7

* "He tenido la idea de implementar cada uno de los seis cálculos dentro de su propio hilo para acelerar el tiempo de procesamiento" * [sic] ... Este tipo de cálculo en paralelo para acelerar una aplicación con CPU solo traiga una aceleración si la CPU en la que está ejecutando su aplicación tiene al menos 6 núcleos disponibles para su aplicación Java. Si solo tienes, digamos, dos núcleos, entonces generar 6 hilos en lugar de dos en realidad retrasará tu programa ... – TacticalCoder

+0

¡Ah, sí, eso tiene perfecto sentido! Gracias. –

+0

@ user988052 que no tiene ningún sentido. Si tiene x hilos, entonces no necesariamente necesita al menos x núcleos para que el programa se ejecute más rápido. Siempre que haya más de 1 CPU lógica disponible para la JVM, el sistema operativo intentará extender esos hilos entre esas CPU lógicas. Las CPU más lógicas - >> menos subprocesos por CPU - >> finalizan más rápido. Puede ser mucho más complicado que eso (cuando se trata de algunos bloqueos, por ejemplo), lo sé, pero generalmente funciona de esta manera. –

Respuesta

5

user988052 que es correcto, por supuesto - si usted no tiene una CPU de núcleo múltiple, haciendo el cálculo en seis temas diferentes en realidad ralentizar su aplicación debido a la sobrecarga eso viene con la creación y administración de hilos.

Sin embargo, si desea hacer estos cálculos en seis subprocesos separados, podría usar un SwingWorker como el hilo de administración y generar 5-6 nuevos subprocesos dentro de él. El uso de ExecutorService sería el camino a seguir, ya que utiliza un conjunto de hilos y, por lo tanto, minimiza la sobrecarga que conlleva la creación y eliminación de un hilo.

Editar: para responder a su comentario:

Creo que la mejor forma sería el implemento su cálculo en una Runnable (de modo que cada uno de los seis cálculos pueden funcionar por separado), entonces simplemente utilizar un ExecutorService, instancia su Runnable seis veces y use ExecutorService.submit(Runnable task). Puede hacer todo esto dentro del método SwingWorker.doInBackground().

Nunca debe llamar al método run() usted mismo - permita que lo haga un Thread/ExecutorService.

+0

Entonces, ¿necesitaría crear un método de ejecución dentro de la clase swingworker, y luego llamar ejecutar cada vez que quisiera que se ejecutara un nuevo subproceso con el Ejecutor? –

+0

Vea mi edición para una respuesta a su comentario. – mort

+0

Creo que depende mucho de cuánto tiempo espere que tomen los cálculos. Si estamos hablando de un tiempo de cálculo de aproximadamente 2 segundos, entonces probablemente no sea una buena idea usar los 6 hilos. Pero si es más que eso (10s, 30s, 1min, 5min, etc.), entonces los 6 hilos tienen sentido. Toda la sobrecarga generada por crear/administrar/cambiar entre los 6 hilos es computacionalmente SOOOOOO barato en estos días, que no debería ser un problema. Si crees que tiene más sentido crear los 6 hilos, hazlo. Incluso podría acelerar las cosas si el usuario tiene un doble núcleo/triple núcleo/cuatro núcleos/etc. UPC. –