2010-10-04 14 views
8

Voglio poter usare la sottoclasse SwingWorker più volte è possibile, come ho letto nel documento java "SwingWorker è progettato solo per essere eseguito una volta. L'esecuzione di uno SwingWorker più di una volta non comporterà il richiamo il metodo doInBackground due volte. "esegui SwingWorker più volte

Qualche idea?

Grazie

+1

Vuoi dire che vuoi riutilizzare la classe di implementazione SwingWorker o l'istanza della classe? – Qwerky

+0

Non so se ho qualcosa di sbagliato ma quando creo istanze worker e chiamo il metodo execute() non viene eseguito nulla. Tuttavia, quando ho provato a chiamare il metodo doInBackground() i lavoratori eseguiti –

risposta

8

Un esempio di una classe che implementa SwingWorker può essere davvero funzionato solo una volta. Non ci sono limiti nell'istanziare tutte le istanze di cui hai bisogno ed eseguirle.

+1

Esiste una limitazione, il fatto che più oggetti debbano essere eliminati dalla procedura di garbage collection lo rende una limitazione. Per le piccole app questo potrebbe non essere importante, ma per le applicazioni estremamente grandi che sono costrette a ridurre al minimo il numero di cose che vengono raccolte dalla garbage collection per motivi di prestazioni, questa è una limitazione. Dire, direttamente, che non ci sono limitazioni non è corretto ... solo perché non si applica a tutti non lo rende non una cosa. – searchengine27

+0

Hai letto il limita tihon della classe? Non funzionerà se un'istanza viene eseguita più di una volta. Non c'è alternativa. E se la memoria è una limitazione molto probabilmente Java non è la soluzione giusta. Quindi, se viene usato Java e c'è abbastanza memoria non ci sono limitazioni. Per le applicazioni più grandi è anche un problema. Devono essere progettati per la raccolta dei rifiuti parziale. Casi estremi potrebbero aver bisogno di qualcosa come un Disruptor, ma non ha senso avere UI integrato in Swing –

+1

Umm ... c'è un'alternativa. Avere una singola istanza di un eseguibile e un 'ExecutorService'. Anche nella documentazione di 'SwingWorker', dice che è una classe di convenienza. Ci sono facilmente altre alternative. 'SwingWorker' è appropriato solo quando puoi rinunciare ad alcune cose per gli altri. – searchengine27

1

Non è possibile istanziare il numero di istanze necessarie e eseguirle. Nella classe SwingWorker esiste javax.swing.SwingWorker. MAX_WORKER_THREADS = 10. Quindi è possibile eseguire un massimo di 10 istanze. Un'istanza viene liberata solo se impiega 10 minuti in idle time. Non utilizzare l'istanza di SwingWorker come istanza di Thread, non è un thread.

0

Prova a fare questo:

private void startTask() {// main method that creates the background task or class that implements the SwingWorker 

    AppContext appContext = AppContext.getAppContext(); 
    if(appContext!=null){ 
     appContext.remove(SwingWorker.class); 
    } 
    MassiveMigrationTask task = new MassiveMigrationTask();// class that implements the SwingWorker 
    task.execute();// this process implicitly adds the SwingWorker.class to the appContext 
    } 

Come la descrizione: "L'AppContext è una tabella a cui fa riferimento ThreadGroup che memorizza le istanze di servizio delle applicazioni"

Quindi questo problema sta accadendo fondamentalmente perché l'AppContext sta salvando il nome del thread chiamato SwingWorker ..., quindi se provi a creare un'altra istanza del thread probabilmente non avrai successo, perché valuta quel nome del thread prima di eseguire un nuovo o almeno mettere il nuovo nel mucchio di fili da eseguire, non esitate consultando il codice qui:

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/sun/awt/AppContext.java

PS: Importante: "Se non si sta scrivendo un servizio applicativo, o non so di cosa si tratta, per favore non usare questa classe "