2010-10-04 9 views
8

Ich möchte SwingWorker Subclass mehrere Male verwenden können ist dies möglich, wie ich im Java-Dokument gelesen habe "SwingWorker ist nur für die einmalige Ausführung ausgelegt. Wird ein SwingWorker mehr als einmal ausgeführt, führt dies nicht zum Aufruf die DoInBackground-Methode zweimal. "SwingWorker mehrmals ausführen

Irgendwelche Ideen?

Dank

+1

Meinst du, du willst Wiederverwendung Ihrer SwingWorker-Implementierungsklasse oder einer Instanz der Klasse? – Qwerky

+0

Ich weiß nicht, vielleicht habe ich etwas falsch, aber wenn ich Arbeiter-Instanzen erstellen und execute() -Methode aufrufen, wird nichts ausgeführt. Wenn ich jedoch versuchte, die doInBackground() -Methode aufzurufen, führten die Worker –

Antwort

8

Eine Instanz einer Klasse Umsetzung Swingworker kann in der Tat sein, nur einmal lief. Es gibt keine Einschränkungen beim Instanziieren von beliebig vielen Instanzen und deren Ausführung.

+1

aus. Es gibt eine Einschränkung. Die Tatsache, dass mehrere Objekte als Garbage Collected erfasst werden müssen, macht dies zu einer Einschränkung. Für die kleinen Apps spielt dies keine Rolle, aber für extrem große Anwendungen, die gezwungen sind, die Anzahl der Dinge zu minimieren, die aus Performance-Gründen Müll sammeln, ist dies eine Einschränkung. Zu sagen, geradeaus, dass es keine Einschränkungen gibt, ist nicht richtig ... nur weil es nicht für jeden gilt, macht es nicht eine Sache. – searchengine27

+0

Haben Sie die Limita Tihon der Klasse gelesen? Es wird nicht funktionieren, wenn eine Instanz mehr als einmal ausgeführt wird. Es gibt keine Alternative. Und wenn der Speicher eine Einschränkung ist, ist Java wahrscheinlich nicht die richtige Lösung. Wenn also Java verwendet wird und genügend Speicher vorhanden ist, gibt es keine Einschränkungen. Bei größeren Anwendungen ist das auch kein Problem. Sie müssen für die teilweise Speicherbereinigung entworfen werden. Extreme Fälle brauchen vielleicht etwas wie einen Disruptor, aber dann hat es keinen Sinn, eine Benutzeroberfläche in Swing zu haben. –

+1

Umm ... es gibt eine Alternative. Habe eine einzelne Instanz eines ausführbaren Laufs und einen 'ExecutorService'. Sogar in der 'SwingWorker'-Dokumentation heißt es, dass es sich um eine Convenience-Klasse handelt. Es gibt leicht andere Alternativen. 'SwingWorker' ist nur dann sinnvoll, wenn man auf bestimmte Dinge für andere verzichten kann. – searchengine27

1

Sie können nicht so viele benötigte Instanzen instanziieren und sie ausführen. In der SwingWorker-Klasse existiert javax.swing.SwingWorker. MAX_WORKER_THREADS = 10. Sie können also maximal 10 Instanzen ausführen. Eine Instanz wird nur freigegeben, wenn sie 10 Minuten im Leerlauf ist. Verwenden Sie die SwingWorker-Instanz nicht als Thread-Instanz, sie ist kein Thread.

0

Versuchen, dies zu tun:

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 
    } 

Da die Beschreibung: "Die AppContext ist eine Tabelle von Thread verwiesen, die Application-Service-Instanzen speichert"

Dieses Problem tritt im Grunde deshalb auf, weil der AppContext den Namen des Threads namens SwingWorker ... speichert. Wenn Sie also versuchen, eine andere Instanz des Threads zu erstellen, werden Sie wahrscheinlich keinen Erfolg haben, da er den Thread-Namen auswertet bevor Sie eine neue oder zumindest setzen die neuen in dem Haufen der Threads ausgeführt Ausführung werden, fühlen Sie den Code frei Beratung hier:

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

PS: Wichtig: "Wenn Sie nicht ein Application Service schreiben, oder nicht wissen, was man ist, bitte verwenden Sie nicht diese Klasse "

Verwandte Themen