2010-08-27 4 views
6

Sembra che quando istanzio 12 thread Swing Worker, i primi sei iniziano a completare il suo compito, finisce E poi gli ultimi sei inizia e finisce. Il comportamento che sto cercando è che tutti e 12 i thread inizino a lavorare contemporaneamente allo & allo stesso tempo.Thread Worker swing non simultanei

Ho il seguente:

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

Il MyTask m aumenterà una barra di avanzamento 0-100 con incrementi di 25. Sto ricevendo un comportamento stravagante che i primi sei fili cominciano incremento, che terminerà a 100, quindi gli ultimi sei thread iniziano da 0 e incrementano e terminano.

C'è un fattore limitante sulla quantità di thread di Swing Worker che si possono avere?

risposta

6

Il comportamento che sto cercando è che tutti e 12 i thread inizino a lavorare contemporaneamente allo & allo stesso tempo.

A CountDownLatch è progettato per questo scopo. Ecco un buon example utilizzando un singolo SwingWorker e un numero di thread sussidiari controllati dal latch.

+0

il mio elemento di apprendimento del giorno :-) Solo non mi piace un aspetto dell'esempio: le attività accedono a textComponent dall'EDT (che in quel momento era ancora documentato per essere thread-safe ... che è sempre stato discusso ...) In breve: meglio non fare affidamento su di esso e avvolgere in un invocapo – kleopatra

+0

@kleopatra: ben chiazzato! Questo [esempio] (http://stackoverflow.com/a/3245805/230513) ha avuto un problema simile (latente); il suo metodo 'display()' illustra il tuo suggerimento. – trashgod

+0

Vedere anche questo [esempio] (http://stackoverflow.com/a/11372932/230513). – trashgod

3

La tua domanda dice:

Il comportamento che sto cercando è tutte le 12 discussioni iniziano a lavorare allo stesso tempo & arrivo allo stesso tempo.

Tuttavia, non è possibile garantire che tutti i thread di Swing worker inizino contemporaneamente e terminino alla stessa ora.

+0

Perché no? Qual è il ragionamento dietro a questo? –

+0

Poiché si tratta di thread e l'esecuzione di thread dipende da più fattori, numero di CPU, sistema operativo, risorse disponibili ecc. Ecc. – YoK

+0

Vedere la risposta per un alernativo. – trashgod

2

classe SwingWorker ha un campo ExecutorService statico con MAX_WORKER_THREADS = 10. Io non sono certo questo che si vede 6 e non 10. Ma non si può andare oltre 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

Posso modificare manualmente il # di MAX_WORKER_THREADS o non è possibile? Qual è il motivo per avere un numero arbitrario di 10 thread? –

+0

No, non è possibile modificare il # di MAX_WORKER_THREADS, poiché si tratta di un campo finale. Per quanto riguarda il ragionamento, devi chiedere a Igor Kushnirskiy (l'autore della classe). –

+1

È possibile utilizzare il proprio ExecutorService per eseguire SwingWorkers, perché sono Futures – keuleJ