2012-02-10 14 views
7

Sono in procinto di progettare un'applicazione guidata da GUI Java che esegue una serie di attività separate, ciascuna all'interno della propria classe estesa SwingWorker. Questo è il design normale che utilizzo per eseguire attività sui propri thread e mantenere l'EDT libero per aggiornare la GUI. Ogni SwingWorker viene avviato sul proprio thread utilizzando un Executors.newCachedThreadPool.Java Swingworker e più thread

Tuttavia, all'interno di una particolare classe, è necessario un processo che richiede molto tempo per l'elaborazione. L'attività contiene un ciclo for che esegue alcuni calcoli fino a sei volte.

Ho pensato di implementare ciascuno dei sei calcoli all'interno della propria thread per accelerare i tempi di elaborazione, ma non sono sicuro del modo migliore di implementarlo.

È possibile estendere sia SwingWorker sia implementare Runnable, quindi utilizzare un metodo void Run() all'interno del ciclo for, avviare una nuova discussione ogni volta oppure utilizzare un cacheThreadPool.

O sto meglio usando solo l'implementazione Thread() standard?

Qualsiasi consiglio o suggerimento sarebbe apprezzato.

Grazie in anticipo

Josh

+7

* "Ho avuto l'idea di implementare ciascuno dei sei calcoli all'interno della loro stessa thread per accelerare il tempo di elaborazione" * [sic] ... Questo tipo di calcolo parallelo per accelerare l'applicazione con CPU solo aumenta la velocità se la CPU su cui stai usando la tua app ha almeno 6 core disponibili per la tua app Java. Se hai solo, per esempio, due core, allora la generazione di 6 thread invece di due rallenterà davvero il tuo programma ... – TacticalCoder

+0

Ah sì, questo ha perfettamente senso !! Grazie. –

+0

@ user988052 che non ha alcun senso. Se hai thread x, non hai necessariamente bisogno di almeno x core per far funzionare il programma più velocemente. Finché ci sono più di 1 CPU logica disponibile per JVM, il sistema operativo cercherà di distribuire tali thread tra quelle CPU logiche. CPU più logiche - >> meno thread per CPU - >> finisce più velocemente. Può essere molto più complicato di quello (quando sono coinvolti alcuni blocchi, per esempio), lo so, ma di solito funziona in questo modo. –

risposta

5

user988052 è giusto ovviamente - se non si dispone di una CPU multicore, facendo il calcolo in sei diversi thread sarà effettivamente rallentare l'applicazione a causa del sovraccarico viene fornito con la creazione e l'amministrazione di thread.

Se si desidera eseguire questi calcoli in sei thread separati, tuttavia, è possibile utilizzare SwingWorker come thread di gestione e generare 5-6 nuovi thread al suo interno. Utilizzare ExecutorService sarebbe quindi la strada da percorrere, poiché utilizza un pool di thread e quindi riduce al minimo l'overhead che viene fornito con la creazione e lo smaltimento di un thread.

Edit: per rispondere alla tua commento:

penso che il modo migliore sarebbe l'attrezzo il calcolo in un Runnable (in modo che ciascuna delle sei calcoli può essere eseguito separatamente), quindi è sufficiente utilizzare un ExecutorService, istanziare la tua Runnable sei volte e utilizzare ExecutorService.submit(Runnable task). Puoi fare tutto questo nel metodo SwingWorker.doInBackground().

Non si dovrebbe mai chiamare il metodo run() da soli - sia fatto da Thread/ExecutorService.

+0

Quindi dovrei creare un metodo di esecuzione all'interno della classe swingworker e quindi richiamare l'esecuzione ogni volta che desidero eseguire un nuovo thread utilizzando l'Executor? –

+0

Vedere la mia modifica per una risposta al tuo commento. – mort

+0

Penso che dipenda molto da quanto tempo ci si aspetta dai calcoli. Se stiamo parlando di un tempo di elaborazione di circa 2 secondi, probabilmente non è una buona idea usare i 6 thread. Ma se è più di questo (10s, 30s, 1min, 5min ecc.), Allora i 6 thread hanno senso. Tutto il sovraccarico generato dalla creazione/amministrazione/passaggio tra i 6 thread è computazionalmente SOOOOOO a buon mercato in questi giorni, che non dovrebbe essere un problema. Se pensi che abbia più senso creare i 6 thread, fallo. Potrebbe anche velocizzare le cose se l'utente ha un dual-core/triplo core/quad-core/ecc. PROCESSORE. –