2010-08-27 25 views
6

Parece que cuando instalo 12 hilos de Swing Worker, los primeros seis comienzan a completar su tarea, finaliza Y luego los últimos seis inicios y finalizan. El comportamiento que estoy buscando es que los 12 hilos comiencen a funcionar al mismo tiempo que & terminen al mismo tiempo.Hilos de Swing Worker no simultáneos

Tengo el siguiente:

for (int i = 0; i < 12; i++) 
{ 
     myTask m = new Mytask(i, START); 
     m.execute(); 
} 

El MyTask m incrementará una barra de situación de 0 - 100 en incrementos de 25. Estoy en trámites de comportamiento extraño que los primeros seis hilos empiezan a incrementar, que al terminar 100, luego los últimos seis hilos comienzan desde 0 e incrementan y terminan.

¿Hay un factor limitante en la cantidad de hilos de Swing Worker que uno pueda tener?

Respuesta

6

El comportamiento que estoy buscando es que los 12 hilos comiencen a funcionar al mismo tiempo & terminen al mismo tiempo.

A CountDownLatch está diseñado para este propósito. Aquí hay un buen example usando un solo SwingWorker y un número de subprocesos secundarios controlados por el pestillo.

+0

mi ítem de aprendizaje del día :-) Solo que no me gusta un aspecto del ejemplo: las tareas acceden al textComponent fuera del EDT (que en ese momento aún estaba documentado que era seguro para hilos ... lo cual siempre se discutió ...) En resumen: mejor no confiar en él y envolverlo en una invocación. Más información – kleopatra

+0

@kleopatra: ¡Bien visto! Este [ejemplo] (http://stackoverflow.com/a/3245805/230513) tuvo un problema similar (latente); su método 'display()' ilustra tu sugerencia. – trashgod

+0

Vea también, este [ejemplo] (http://stackoverflow.com/a/11372932/230513). – trashgod

3

Su pregunta dice:

El comportamiento que estoy buscando es todos los 12 roscas comienzan a trabajar al mismo tiempo & meta al mismo tiempo.

Pero no se puede garantizar para todos los hilos de los trabajadores de Swing que comienzan al mismo tiempo y que terminan al mismo tiempo.

+0

¿Por qué no? ¿Cuál es el razonamiento detrás de eso? –

+0

porque son subprocesos, y la ejecución de subprocesos depende de facódigos múltiples, n. De CPU, sistema operativo, recursos disponibles, etc. – YoK

+0

Consulte mi respuesta para obtener una explicación. – trashgod

2

clase SwingWorker tiene un campo estático con ExecutorService MAX_WORKER_THREADS = 10. No estoy seguro de por qué ves 6 y no 10. Pero no se puede ir más de 10.

/** 
    * number of worker threads. 
    */ 
    private static final int MAX_WORKER_THREADS = 10; 

...

executorService = 
       new ThreadPoolExecutor(1, MAX_WORKER_THREADS, 
             10L, TimeUnit.MINUTES, 
             new LinkedBlockingQueue<Runnable>(), 
             threadFactory); 
+0

¿Puedo cambiar manualmente el número de MAX_WORKER_THREADS o no es posible? ¿Cuál es el razonamiento de tener un número arbritrary de 10 hilos? –

+0

No, no puede cambiar el número de MAX_WORKER_THREADS, ya que es un campo final. En cuanto al razonamiento, debes preguntarle a Igor Kushnirskiy (el autor de la clase). –

+1

Puede usar su propio ExecutorService para ejecutar SwingWorkers, porque son futuros – keuleJ