SwingWorker Thread pausieren

Status
Nicht offen für weitere Antworten.

Liathne

Mitglied
Guten Morgen zusammen,

ich habe eine GUI von welcher ein SwingWorker Thread gestartet wird. Während der SwingWorker arbeitet möchte ich einen Button einblenden um diesen Thread gegebenenfalls zu pausieren oder zu beenden.
Das Erscheinen der Buttons zu realisieren ist kein Problem, jedoch fehlt mir zu der Möglichkeit den SwingWorker zu pausieren oder zu beenden momentan jeder Ansatz.

Vielen Dank für Eure Hilfe.

Liathne
 

Lex

Mitglied
Morgen,

eine einfache Lösung um das zu realisieren wären zwei geschachtelte while-Schleifen in deiner doInBackground.

Code:
while (alive){
         while(!pause){
            //Verarbeitung
         }
}

Dazu dann noch zwei Methode in deinem SwingWorker, die du aus deiner Oberfläche aufrufen kannst.

Code:
public void kill(){
      alive = false;
}
   
public void tooglePause(){
      pause = !pause;
}

Is zugegeben nicht die optimalste Lösung sollte aber den Zweck erfüllen ;-)

MfG
Lex
 

JuVman5KL

Mitglied
Hallo Lex,
um das Thema nochmal aufzugreifen, muss ich leider sagen, dass der Ansatz bei dem folgenden Programm nicht funktioniert (GUI mit zwei Buttons zum Starten um Stoppen des SwingWorkers, als rechenintensive Aufgabe werden alle Verzeichnisse und Dateien des Systems ausgegeben).

Code:
import java.awt.BorderLayout;
import java.io.File;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;

public class NewClass extends JFrame{
    static DefaultListModel listModel = new DefaultListModel();
    static boolean alive = true;

    JButton jButton1 = new JButton("SwingWorker starten");
    JButton jButton2 = new JButton("SwingWorker beenden");

    public NewClass() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        listModel.addElement("abc");
        JList jList1 = new JList();
        jList1.setModel(listModel);
        jList1.setDoubhttp://www.buecherbillig.de/category/Programmierung_Java.html?ref=38leBuffered(true);
        JScrollPane jScrollPane1 = new JScrollPane(jList1);
        
        add(jButton1, BorderLayout.NORTH);
        add(jButton2, BorderLayout.SOUTH);
        add(jScrollPane1, BorderLayout.CENTER);

        jButton1.addMouseListener(new java.awt.event.MouseAdapter() {
            @Override
            public void mouseClicked(java.awt.event.MouseEvent evt){
                worker.execute();
            }
        });

        jButton2.addMouseListener(new java.awt.event.MouseAdapter() {
            @Override
            public void mouseClicked(java.awt.event.MouseEvent evt){
                worker.kill();
            }
        });
    }

    public static void nextDirectory(String directory) {
        File firstDirectory = new File(directory);
        File[] firstDirectoryArray = firstDirectory.listFiles();
        for(int a = 0; a < firstDirectoryArray.length; a++){
            final File[] firstDirectoryArray1 = firstDirectoryArray;
            final int a1 = a;
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    listModel.addElement(firstDirectoryArray1[a1]);
                }
            });

            if(firstDirectoryArray[a].isDirectory() && firstDirectoryArray[a].list() != null){
                nextDirectory(firstDirectoryArray[a].toString());
            }
        }
    }
    
    static class Worker extends SwingWorker{
        @Override
        protected Void doInBackground() {
            while(alive){
                nextDirectory("C:\\Users");
            }
            return null;
        }

        public void kill(){
            alive = false;
        }
    }

    Worker worker = new Worker();

    public static void main(String[] args) {
        NewClass window = new NewClass();
        window.setVisible(true);
        window.setSize(300, 300);
    }
}

Ich hoffe, dass das Thema jetzt als aktuell angezeigt wird. Für Lösungsvorschläge und -ansätze bin ich wie immer sehr dankbar.

Viele Grüße
 
G

Gast

Gast
Naja der SwingWorker ist eigentlich dafür da etwas im Hintergrund durchzuführen und sich zu melden wenn es fertig ist.

Benutz doch lieber nen Thread.
 

Ebenius

Top Contributor
Lex hat gesagt.:
Morgen,

eine einfache Lösung um das zu realisieren wären zwei geschachtelte while-Schleifen in deiner doInBackground.

Code:
while (alive){
         while(!pause){
            //Verarbeitung
         }
}
:cool: Worum geht's hier? Den Prozessor mit einem pausierten Thread so gut wie möglich auszulasten? ;-)

Ebenius
 

Ebenius

Top Contributor
Und wenn noch ein notify steht... Und beides auf dem selben Objekt... Und natürlich in je einem synchronized-Block... Und wenn das Beispiel dann natürlich ganz anders aussieht... :)

Ebenius
 

JuVman5KL

Mitglied
Hallo Gast, der du mir empfohlen hast, einen Thread zu benutzen,
wenn ich in der Klasse Worker nun Thread statt SwingWorker ableite und die doInBackground()-Methode durch run() ersetze (ansonsten alles wie vorher (abgesehen von Zeile 25)), habe ich ebenso meine Probleme, den Thread mit
Code:
<Thread-Objekt>.interrupt()
<Thread-Objekt> = null;

oder einer Methode wie z. B.
Code:
public void kill() {
    alive = false;
}

Code:
import java.awt.BorderLayout;
import java.io.File;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;

public class NewClass extends JFrame{
    static DefaultListModel listModel = new DefaultListModel();
    static boolean alive = true;

    JButton jButton1 = new JButton("Thread starten");
    JButton jButton2 = new JButton("Thread beenden");

    public NewClass() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        listModel.addElement("abc");
        JList jList1 = new JList();
        jList1.setModel(listModel);
        jList1.setDoubleBuffered(true);
        JScrollPane jScrollPane1 = new JScrollPane(jList1);
        
        add(jButton1, BorderLayout.NORTH);
        add(jButton2, BorderLayout.SOUTH);
        add(jScrollPane1, BorderLayout.CENTER);

        jButton1.addMouseListener(new java.awt.event.MouseAdapter() {
            @Override
            public void mouseClicked(java.awt.event.MouseEvent evt){
                Worker worker1 = new Worker();
                worker1.start();
            }
        });

        jButton2.addMouseListener(new java.awt.event.MouseAdapter() {
            @Override
            public void mouseClicked(java.awt.event.MouseEvent evt){
                kill();
            }
        });
    }

    public void kill(){
        alive = false;
    }

    public static void nextDirectory(String directory) {
        File firstDirectory = new File(directory);
        File[] firstDirectoryArray = firstDirectory.listFiles();
        for(int a = 0; a < firstDirectoryArray.length; a++){
            final File[] firstDirectoryArray1 = firstDirectoryArray;
            final int a1 = a;
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    listModel.addElement(firstDirectoryArray1[a1]);
                }
            });

            if(firstDirectoryArray[a].isDirectory() && firstDirectoryArray[a].list() != null){
                nextDirectory(firstDirectoryArray[a].toString());
            }
        }
    }
    
    private class Worker extends Thread {

        @Override
        public void run() {
            while(alive){
                nextDirectory("C:\\Users");
            }
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable () {
            public void run() {
                NewClass window = new NewClass();
                window.setVisible(true);
                window.setSize(300, 300);
            }
        });
    }
}

Wie kann ich mich über Threads informieren? Das Java-Tutorial (http://java.sun.com/docs/books/tutorial/uiswing/concurrency/index.html) und die Infos auf http://openbook.galileocomputing.de/javainsel7/ sind nicht sehr ergiebig.
 
G

Gast2

Gast
nur mal so nebenbei bei buttons benutzt man ActionsListener und keine MouseListener...
 

JuVman5KL

Mitglied
Ja, das stimmt. Das wusste ich bis jetzt noch nicht. Allerdings löst der Einsatz von ActionListenenern das Problem nicht. Der jButton1, der den Thread startet, funktioniert immerhin auch mit einem MouseListener.

Für weitere Hilfe bin ich sehr dankbar.

Viele Grüße
 
G

Gast2

Gast
hab deine klasse bischen gekürzt so funktionierts... kannst ja auf dein bsp. anwenden...
Code:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;

public class NewClass extends JFrame{

    private boolean alive = true;

    JButton jButton1 = new JButton("Thread starten");
    JButton jButton2 = new JButton("Thread beenden");

    public NewClass() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        
        add(jButton1, BorderLayout.NORTH);
        add(jButton2, BorderLayout.SOUTH);

        jButton1.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {
				   new Worker().start();	
			}
        
        });

        jButton2.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {
				   kill();
			}
        
        });
    }

    public void kill(){
    	System.out.println("Thread beendet");
        alive = false;
    }

   
    private class Worker extends Thread {

        @Override
        public void run() {
            while(alive){
                System.out.println("Thread läuft");
            }
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable () {
            public void run() {
                NewClass window = new NewClass();
                window.setVisible(true);
                window.setSize(300, 300);
            }
        });
    }
}
 

JuVman5KL

Mitglied
Hallo SirWayne,
ich bin dir sehr dankbar, dass du dir für das Problem Zeit genommen hast, allerdings hat gerade das Kürzen der Klasse dazu geführt, dass beim Ersetzen der einfachen System.out.println-Anweisung durch die nextDirectory-Methode (die ja in sich nochmal eine SwingUtilities.invokeLater-Anweisung enthält) sich der Thread eben nicht mehr beenden lässt.
Die Klasse sollte aber natürlich auch mit der nextDirectory-Methode laufen.

Falls du oder jemand anders eine Lösung, die auch das Einbinden der nextDirectory-Methode berücksichtigt, meldet euch bitte.

Viele Grüße
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
F swingworker und eventdispatch thread AWT, Swing, JavaFX & SWT 9
ralfb1105 Swing Frage zu SwingWorker Verhalten bei cancel() AWT, Swing, JavaFX & SWT 2
ralfb1105 Swing SwingWorker - max 10 Threats werden gestartet !? AWT, Swing, JavaFX & SWT 5
ralfb1105 Swing Ausführung einer SwingWorker Klasse stoppen AWT, Swing, JavaFX & SWT 4
ralfb1105 Swing Timer in SwingWorker stoppen AWT, Swing, JavaFX & SWT 4
S Swing SwingWorker - richtige Implementierung doInBackground() AWT, Swing, JavaFX & SWT 5
H Swing BufferedReader.close() hängt im SwingWorker AWT, Swing, JavaFX & SWT 1
Nuiton Swing SwingWorker - Prozess stoppen AWT, Swing, JavaFX & SWT 4
Thallius Auf Swingworker warten? AWT, Swing, JavaFX & SWT 5
M SwingWorker Hilfe! AWT, Swing, JavaFX & SWT 10
J Swing Nach SwingWorker Funktion aus der GUI Klasse aufrufen AWT, Swing, JavaFX & SWT 5
C Swing SwingWorker abbrechen AWT, Swing, JavaFX & SWT 12
C Swing SwingWorker: Auf beendigung eines Formulars / einer Arbeit warten AWT, Swing, JavaFX & SWT 10
Psypsy Swing SwingWorker unterschied zwischen setProgress und process AWT, Swing, JavaFX & SWT 2
A Swingworker rückgabewert verwenden AWT, Swing, JavaFX & SWT 9
B Frage zu Swing,Threads, SwingWorker und Socket Communikation AWT, Swing, JavaFX & SWT 4
M Prioritäten bei SwingWorker / Threads AWT, Swing, JavaFX & SWT 9
M Liste mittels SwingWorker füllen klappt nicht AWT, Swing, JavaFX & SWT 10
Iron Monkey SwingWorker verschwindet nicht AWT, Swing, JavaFX & SWT 10
X Prozess mit Runtime.getRuntime in SwingWorker aufrufen AWT, Swing, JavaFX & SWT 6
R Zugriff auf Model im MVC-Design aus SwingWorker heraus AWT, Swing, JavaFX & SWT 3
G SwingWorker setProgress Problem AWT, Swing, JavaFX & SWT 17
K Frage zu ProgressBar, SwingWorker etc. AWT, Swing, JavaFX & SWT 4
G SwingWorker AWT, Swing, JavaFX & SWT 2
J Unterschied zwischen SwingWorker und Threads AWT, Swing, JavaFX & SWT 4
S SwingWorker :( AWT, Swing, JavaFX & SWT 6
S SwingWorker - ich werde wahnsinnig AWT, Swing, JavaFX & SWT 4
0 SwingWorker Tutorial ? AWT, Swing, JavaFX & SWT 2
L SwingWorker Statusabfrage AWT, Swing, JavaFX & SWT 8
M Kann ein SwingWorker nur einmal laufen? AWT, Swing, JavaFX & SWT 2
J SwingWorker, get und boolean AWT, Swing, JavaFX & SWT 6
P thread nimmt veränderte boolean nicht AWT, Swing, JavaFX & SWT 7
N JFrame loescht alles, sobald der Thread zuende ist AWT, Swing, JavaFX & SWT 22
M Server/Client thread von GUI Trennen AWT, Swing, JavaFX & SWT 2
K JavaFx, Sound Aufnahme und Thread AWT, Swing, JavaFX & SWT 0
T Exception in thread "main" java.lang.NoClassDefFoundError AWT, Swing, JavaFX & SWT 4
G Exception javafx Thread -> caused by removing children while in EventHandler AWT, Swing, JavaFX & SWT 28
H Event Handling Thread - Abruf der get-Methode AWT, Swing, JavaFX & SWT 5
J "Exception in thread "AWT-EventQueue-0"" Fehler AWT, Swing, JavaFX & SWT 3
G Thread starten Swing AWT, Swing, JavaFX & SWT 5
C Thread verwalten AWT, Swing, JavaFX & SWT 2
A Swing Exception in thread "AWT-EventQueue-0" AWT, Swing, JavaFX & SWT 1
S JavaFX Exception in thread "JavaFX Application Thread" AWT, Swing, JavaFX & SWT 3
L Label im JavaFX Thread Updaten AWT, Swing, JavaFX & SWT 3
ralfb1105 JavaFX Alert Confirmation Dialog aus einem Service Thread AWT, Swing, JavaFX & SWT 8
ralfb1105 JavaFX MVC: Thread in Model Class mit Ausgabe in TextArea AWT, Swing, JavaFX & SWT 10
D Swing SwingUtils / Thread Problem AWT, Swing, JavaFX & SWT 3
J Thread per Button starten AWT, Swing, JavaFX & SWT 10
J Thread kennt JButton nicht. AWT, Swing, JavaFX & SWT 11
T JavaFX Task / Thread / FXThread Komplikationen AWT, Swing, JavaFX & SWT 5
O Swing Event Dispatch Thread AWT, Swing, JavaFX & SWT 1
L JavaFX UI Thread block AWT, Swing, JavaFX & SWT 13
X Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1 AWT, Swing, JavaFX & SWT 6
sandaime Swing Thread für CMD auslesen AWT, Swing, JavaFX & SWT 16
E JavaFX JavaFX Application in Thread ausführen AWT, Swing, JavaFX & SWT 1
D JavaFX UI-Thread und DB-Thread trennen um z.B. Ladebalken anzuzeigen AWT, Swing, JavaFX & SWT 15
T JavaFX Controller im extra Thread AWT, Swing, JavaFX & SWT 0
T Swing 2 Thread.sleep parallel laufen lassen AWT, Swing, JavaFX & SWT 4
L Zweites Fenster mit Thread AWT, Swing, JavaFX & SWT 0
E JavaFX Stage.show() in ursprünglichem Thread starten AWT, Swing, JavaFX & SWT 7
L Swing Frame in Thread wird nicht gezeichnet AWT, Swing, JavaFX & SWT 2
N Programm mit Swing und Thread, Figur bewegen sich nicht AWT, Swing, JavaFX & SWT 6
C Im ActionListener Buttons disablen, einen Thread starten, dann Buttons enablen AWT, Swing, JavaFX & SWT 2
C Thread-/ Simulations- Problem AWT, Swing, JavaFX & SWT 18
T Swing Button bleibt grau [=> UI hat sich aufgehängt, Aufgabe in Thread auslagern] AWT, Swing, JavaFX & SWT 3
M Thread-Frage in SWT AWT, Swing, JavaFX & SWT 1
Q GUI außerhalb GUI-Thread updaten - GUI friert ein AWT, Swing, JavaFX & SWT 18
C Thread in Klassen starten AWT, Swing, JavaFX & SWT 4
L exception in thread awt-eventqueue-0 java.lang.nullpointerexception AWT, Swing, JavaFX & SWT 2
S Swing Exception in thread "AWT-EventQueue-0" bei Jlabel AWT, Swing, JavaFX & SWT 4
D SWT SWT Elemente aus anderen Klassen aufrufen - Invalid thread access AWT, Swing, JavaFX & SWT 6
K JavaFX Tableview mit fxml ohne Aktualiserung trotz Thread AWT, Swing, JavaFX & SWT 13
K Event Handling 2 Buttons und Thread stop AWT, Swing, JavaFX & SWT 3
C Swing Update von swing-TableModels per Thread. Eins geht, das andere nicht, warum? AWT, Swing, JavaFX & SWT 12
V JLabel bzw. GUI aus externen Thread ansteuern AWT, Swing, JavaFX & SWT 3
J Applet Paralleles Thread Handling AWT, Swing, JavaFX & SWT 3
H Swing JfreeChart aktualisieren - mit daten aus thread AWT, Swing, JavaFX & SWT 3
T Java Swing Main GUI Thread AWT, Swing, JavaFX & SWT 3
C Event Handling Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException AWT, Swing, JavaFX & SWT 43
T Table-Zeilen mit Thread einfärben AWT, Swing, JavaFX & SWT 15
F Swing GUI-Thread für automatisches Update nutzen AWT, Swing, JavaFX & SWT 10
Y KeyListener, GUI Thread, repaint AWT, Swing, JavaFX & SWT 7
V Nullpointerexception (etwas mit thread und jframe) AWT, Swing, JavaFX & SWT 3
P Problem Thread.sleep() und JProgressBar AWT, Swing, JavaFX & SWT 7
S SWT GUI-Thread AWT, Swing, JavaFX & SWT 11
A Thread und sleep(1000); AWT, Swing, JavaFX & SWT 7
B Swing Thread+Animation AWT, Swing, JavaFX & SWT 7
S Timer oder Thread.sleep AWT, Swing, JavaFX & SWT 3
M Exception in thread "Thread-3" java.lang.NullPointerException AWT, Swing, JavaFX & SWT 18
B Über SWT Button Thread beenden AWT, Swing, JavaFX & SWT 2
C SWT Gui Thread hängt sich auf AWT, Swing, JavaFX & SWT 3
lumo SWT Exception in thread "main" org.eclipse.swt.SWTError: No more handles AWT, Swing, JavaFX & SWT 3
Luk10 Swing Problem mit Zeichen-Thread AWT, Swing, JavaFX & SWT 8
G 2D-Grafik Von Thread aus Zeichnen AWT, Swing, JavaFX & SWT 5
U Swing JLabel bewegen mittels Thread AWT, Swing, JavaFX & SWT 3
M JProgressBar für einen Thread AWT, Swing, JavaFX & SWT 14
R JTable und Thread AWT, Swing, JavaFX & SWT 4
K Thread.sleep in GUI AWT, Swing, JavaFX & SWT 4
J Thread funktioniert nicht AWT, Swing, JavaFX & SWT 10
D JPanel mit Thread in JPanel AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen


Oben