Swing Frage zu SwingWorker Verhalten bei cancel()

ralfb1105

Bekanntes Mitglied
Hallo,

ich habe ein Problem, bzw. ein Verhalten, was ich mir nicht ganz erklären kann und worfür ich eine Lösung suche. Ich habe ein GUI aus dem ich einen Test starte, der dann eine gewisse Zeit läuft und dann beendet wird oder vorher über einen Stop Button beendet wird. Das Ganze habe ich mit SwingWorker Threads realisiert. Hier als Referenz der komplette Code:
Java:
package oracle;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DecimalFormat;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import java.util.UUID;
import java.util.Vector;
import java.util.concurrent.TimeUnit;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JSlider;
import javax.swing.JTextArea;
import javax.swing.JToggleButton;
import javax.swing.WindowConstants;
import javax.swing.border.BevelBorder;
import javax.swing.border.SoftBevelBorder;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;


/**
* This code was edited or generated using CloudGarden's Jigloo
* SWT/Swing GUI Builder, which is free for non-commercial
* use. If Jigloo is being used commercially (ie, by a corporation,
* company or business for any purpose whatever) then you
* should purchase a license for each developer using Jigloo.
* Please visit www.cloudgarden.com for details.
* Use of Jigloo implies acceptance of these licensing terms.
* A COMMERCIAL LICENSE HAS NOT BEEN PURCHASED FOR
* THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED
* LEGALLY FOR ANY CORPORATE OR COMMERCIAL PURPOSE.
*/
@SuppressWarnings("serial")
public class TestMultipleUser extends javax.swing.JFrame {
    private JTextArea jTAOutput;
    private JButton jBExit;
    private JToggleButton jTBStartStop;
    private JSlider jSNoUser;
    private JLabel jLabel1;
    private JLabel jLTestRemaining;
    private JScrollPane jScrollPane1;
    private ProcessWorkerCounter pc;
    private Vector<ProcessWorkerDbTest> vcDbTest;
   
   
    /**
    * Auto-generated main method to display this JFrame
    */
   
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                TestMultipleUser inst = new TestMultipleUser();
                inst.setLocationRelativeTo(null);
                inst.setVisible(true);
            }
        });   
    }
   
    public class ProcessWorkerCounter extends SwingWorker<Void, String>
    {
        private JLabel jLCounter;
        private long seconds;
        private Timer timerCounter;
        private Vector<ProcessWorkerDbTest> vcDbTest;
        private ExecutorService esDbTest;
       
        //Konstruktor
        public ProcessWorkerCounter(JLabel counter, long seconds, Vector<ProcessWorkerDbTest> vcDbTest)
        {
            this.jLCounter = counter;
            this.seconds = seconds;
            this.vcDbTest = vcDbTest;
        }
       
        //getter - Return Timer Object
        public Timer getTimerCounter() {
            return timerCounter;
        }
       
        class TaskCounter extends TimerTask
        {
           
          @Override public void run()
          {
              seconds--;
              long hh = seconds / 3600;
              long mm = (seconds % 3600) / 60;
              long ss = seconds - (hh * 3600) - (mm * 60);
              DecimalFormat format = new DecimalFormat("00");
              publish(format.format(hh) + ":" + format.format(mm) + ":" + format.format(ss));
              if (seconds == 0) {
                  for (int i=0; i < vcDbTest.size(); i++) {
                      ((ProcessWorkerDbTest)vcDbTest.elementAt(i)).cancel(true);
                    }
                  pc.getTimerCounter().cancel();
                publish("Test finished!");
              } 
          }
        }
   
        @Override
        protected Void doInBackground() throws Exception
        {
            //hier l�uft alles in einem eigenen Thread (nebenl�ufig) ab. Es ist also egal wie lange die Abarbeitung hier dauert.
           
            this.timerCounter = new Timer();
            timerCounter.scheduleAtFixedRate(new TaskCounter(), 0, 1000);
           
            //System.out.println("Start Tests: " + vcDbTest.size());
            this.esDbTest = new ThreadPoolExecutor(33, 33, 1L,TimeUnit.MINUTES, new LinkedBlockingQueue<Runnable>());
           
            for (int i=0; i < vcDbTest.size(); i++) {
                esDbTest.execute((Runnable)vcDbTest.elementAt(i));
            }   
            return null;
        }
       
        @Override
        protected void process(List<String> chunks)
        {
            //hier l�uft alles auf dem EDT (Event Dispatch Thread). Darum k�nnen (und sollten) wir hier die GUI Komponenten manipulieren.
            for(int i = 0; i < chunks.size(); i++)
            {
                jLCounter.setText(chunks.get(i));
                //jTAOutput.append(System.getProperty("line.separator"));
            }
        }
    }
   
    public class ProcessWorkerDbTest extends SwingWorker<Void, String>
    {
        private JTextArea jTAOutput;
       
        public ProcessWorkerDbTest(JTextArea textArea)
        {
            this.jTAOutput = textArea;
        }

        @Override
        protected Void doInBackground() throws Exception
        {
            //hier l�uft alles in einem eigenen Thread (nebenl�ufig) ab. Es ist also egal wie lange die Abarbeitung hier dauert.
            UUID uuid = UUID.randomUUID();
            final String randomUUIDString = uuid.toString();
            while (!isCancelled()) {
                for (int i=1000; i>=0; i--) {
                    //System.out.println("DB Test " + randomUUIDString + " Run: " + i);
                    publish("DB Test " + randomUUIDString + " Run: " + i);
                    TimeUnit.SECONDS.sleep(1);
                }
            }
            System.out.println("DB Test " + randomUUIDString + " Finished!");
            return null;
        }
       
        @Override
        protected void process(List<String> chunks)
        {
            //hier l�uft alles auf dem EDT (Event Dispatch Thread). Darum k�nnen (und sollten) wir hier die GUI Komponenten manipulieren.
            for(int i = 0; i < chunks.size(); i++)
            {
                jTAOutput.append(chunks.get(i));
                jTAOutput.append(System.getProperty("line.separator"));
            }
        }
    }
   
   
    public class TestTableSize {
        private String name;
        private int size;
       
        public TestTableSize(String name, int size) {
            this.name = name;
            this.size = size;
        }
       
        public String getTestTableSize() {
            return this.name + ":" + this.size + " MB";
        }
       
        public String getName() {
            return this.name;
        }
       
        public int getSize() {
            return this.size;
        }
    }
   
   
    public TestMultipleUser() {
        super();
        initGUI();
    }
   
    private void initGUI() {
        try {
            setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
            getContentPane().setLayout(null);
            this.setTitle("Test Multiple User");
            {
                jScrollPane1 = new JScrollPane();
                getContentPane().add(jScrollPane1);
                jScrollPane1.setBounds(24, 142, 816, 216);
                {
                    jTAOutput = new JTextArea();
                    jScrollPane1.setViewportView(jTAOutput);
                    jTAOutput.setBounds(24, 142, 816, 216);
                    jTAOutput.setEditable(false);
                }
            }
            {
                jBExit = new JButton();
                getContentPane().add(jBExit);
                jBExit.setText("Exit");
                jBExit.setBounds(852, 335, 80, 23);
                jBExit.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent evt) {
                        jBExitActionPerformed(evt);
                    }
                });
            }
            {
                jLTestRemaining = new JLabel();
                getContentPane().add(jLTestRemaining);
                jLTestRemaining.setBounds(136, 110, 130, 20);
                jLTestRemaining.setBorder(new SoftBevelBorder(BevelBorder.LOWERED, null, null, null, null));
            }
            {
                jLabel1 = new JLabel();
                getContentPane().add(jLabel1);
                jLabel1.setText("Remining Time");
                jLabel1.setBounds(36, 114, 111, 16);
            }
            {

                jSNoUser = new JSlider();
                getContentPane().add(jSNoUser);
                getContentPane().add(getJTBStartStop());

                jSNoUser.setBounds(352, 81, 237, 45);
                jSNoUser.setMinimum(1);
                jSNoUser.setMaximum(33);
                jSNoUser.setMajorTickSpacing(4);
                jSNoUser.setMinorTickSpacing(1);
                jSNoUser.createStandardLabels(1);
                jSNoUser.setPaintLabels(true);
                jSNoUser.setPaintTicks(true);
                jSNoUser.setValue(4);
                jSNoUser.setFont(new java.awt.Font("Segoe UI",0,11));
            }
            pack();
            this.setSize(959, 431);
        } catch (Exception e) {
            //add your error handling code here
            e.printStackTrace();
        }
    }
   
    private void jBExitActionPerformed(ActionEvent evt) {
        System.exit(0);
    }
   
    private void jTBStartStopActionPerformed(ActionEvent evt) {
        toggleButtonAction();
    }
   
    private void toggleButtonAction() {
        if (jTBStartStop.isSelected()) {
            long seconds = 30;
           
            this.vcDbTest = new Vector<ProcessWorkerDbTest>();
           
            for (int i = 1; i <= jSNoUser.getValue(); i++) {
                vcDbTest.add(new ProcessWorkerDbTest(jTAOutput));
            }
           
            this.pc = new ProcessWorkerCounter(jLTestRemaining, seconds, vcDbTest);
            pc.execute();
        } else {
            System.out.println("Stop Tests: " + vcDbTest.size());
            for (int i=0; i < vcDbTest.size(); i++) {
                  ((ProcessWorkerDbTest)vcDbTest.elementAt(i)).cancel(true);
                }
            pc.getTimerCounter().cancel();
            System.out.println("Test stopped!!");
        }
    }
   
    private JToggleButton getJTBStartStop() {
        if(jTBStartStop == null) {
            Icon icon = new ImageIcon("StartTriangel20.png");
            jTBStartStop = new JToggleButton("", icon);
            getContentPane().add(jTBStartStop);
            jTBStartStop.setBounds(641, 72, 20, 20);
            jTBStartStop.setBorderPainted(false);
            jTBStartStop.setIcon(new ImageIcon(getClass().getClassLoader().getResource("StartTriangel20.png")));
            jTBStartStop.setSelectedIcon(new ImageIcon(getClass().getClassLoader().getResource("StopQuad20.png")));
            jTBStartStop.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                    jTBStartStopActionPerformed(evt);
                }
            });
            jTBStartStop.setVisible(true);
        }
        return jTBStartStop;
    }
}

Das Problem:
Wenn ich den Stop Button drücke bzw. die Zeit abgelaufen ist wird der Thread über die cancel() Methode
Java:
for (int i=0; i < vcDbTest.size(); i++) {
                  ((ProcessWorkerDbTest)vcDbTest.elementAt(i)).cancel(true);
                }
beendet:
Java:
private void toggleButtonAction() {
        if (jTBStartStop.isSelected()) {
            long seconds = 30;
           
            this.vcDbTest = new Vector<ProcessWorkerDbTest>();
           
            for (int i = 1; i <= jSNoUser.getValue(); i++) {
                vcDbTest.add(new ProcessWorkerDbTest(jTAOutput));
            }
           
            this.pc = new ProcessWorkerCounter(jLTestRemaining, seconds, vcDbTest);
            pc.execute();
        } else {
            System.out.println("Stop Tests: " + vcDbTest.size());
            for (int i=0; i < vcDbTest.size(); i++) {
                  ((ProcessWorkerDbTest)vcDbTest.elementAt(i)).cancel(true);
                }
            pc.getTimerCounter().cancel();
            System.out.println("Test stopped!!");
        }
    }

Beim cancel() wird der Thread beendet, aber es wird anscheinend der Code der nach der while-Schleife steht nicht mehr ausgeführt:
Java:
while (!isCancelled()) {
                for (int i=1000; i>=0; i--) {
                    //System.out.println("DB Test " + randomUUIDString + " Run: " + i);
                    publish("DB Test " + randomUUIDString + " Run: " + i);
                    TimeUnit.SECONDS.sleep(1);
                }
            }
            System.out.println("DB Test " + randomUUIDString + " Finished!");
            return null;

Ich sehe auf der Console den Text "Test Stopped" aber nicht den Text "System.out.println("DB Test " + randomUUIDString + " Finished!");" aus den einzelnen ProcessWorkerDbTest Threads!?

Für mich wäre es wichtig nach beenden der DB Tests Code auszuführen um "aufzuräumen", sprich z.B. die DB Sessions zu terminieren, etc.

Hat jemand eine Erklärung/Idee was ich hier falsch mache und warum dieser Code nicht mehr ausgeführt wird?

Gruß

Ralf
 

Robat

Top Contributor
Der Code der nach doInBackground() ausgeführt werden soll, sollte in der done() Methode stehen.
Java:
@Override
protected void done() {
    // stuff after task finished
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Frage zu Swing,Threads, SwingWorker und Socket Communikation AWT, Swing, JavaFX & SWT 4
K Frage zu ProgressBar, SwingWorker etc. AWT, Swing, JavaFX & SWT 4
thor_norsk Java - Allgemeine - Frage AWT, Swing, JavaFX & SWT 14
thor_norsk Allgemeine Frage AWT, Swing, JavaFX & SWT 10
M Frage zu Java Bundesligaverwaltung AWT, Swing, JavaFX & SWT 7
thor_norsk Allgemeine Frage AWT, Swing, JavaFX & SWT 9
E Frage zum Textfeld AWT, Swing, JavaFX & SWT 8
H Swing JMenu aufgeklappt oder nicht - Wie frage ich das ab? AWT, Swing, JavaFX & SWT 5
pkm Frage wegen java.lang.IllegalStateException bei DocumentListener AWT, Swing, JavaFX & SWT 4
D Frage zu ActionListenern und AvtionEvents AWT, Swing, JavaFX & SWT 2
ralfb1105 JavaFX Daten zwischen Controllern austauschen- neue Frage AWT, Swing, JavaFX & SWT 7
F JavaFX Frage zum Logging AWT, Swing, JavaFX & SWT 6
E Prinzip: wie man Ereignisse in einer GUI verarbeit. Frage zum Design? AWT, Swing, JavaFX & SWT 10
J Frage zu setuserdata AWT, Swing, JavaFX & SWT 1
N Frage zu ListView AWT, Swing, JavaFX & SWT 11
L 2D-Grafik Frage zu Ellipse2D.Double, Abfrage, ob Punkt enthalten ist funktioniert nicht AWT, Swing, JavaFX & SWT 3
T Frage zu GUI - Button soll Objekt erfassen AWT, Swing, JavaFX & SWT 2
J Event Handling Frage zu der Funktion addActionListener AWT, Swing, JavaFX & SWT 2
J Frage zur objektorentierten Swing Programmierung AWT, Swing, JavaFX & SWT 10
T JavaFX Frage zum FX-Loader AWT, Swing, JavaFX & SWT 3
B drawRect Frage und Aufgabenstellung AWT, Swing, JavaFX & SWT 10
fLooojava GridLayout - Frage bezüglich Kachelgröße AWT, Swing, JavaFX & SWT 5
S Frage zu java.awt.EventQueue AWT, Swing, JavaFX & SWT 1
J Frage zu Java Projekt [2D Game] AWT, Swing, JavaFX & SWT 3
M Swing Grundlegende Frage zu SWING mit WindowBuilder AWT, Swing, JavaFX & SWT 11
M Frage zum Loggen von Fehlern AWT, Swing, JavaFX & SWT 3
T Swing API Frage zu Verzeichnisbäumen und JTree AWT, Swing, JavaFX & SWT 1
M Thread-Frage in SWT AWT, Swing, JavaFX & SWT 1
Q Cursor Frage AWT, Swing, JavaFX & SWT 8
W JavaFX TableView frage AWT, Swing, JavaFX & SWT 5
H Taschenrechnerprojekt in Javafx - Frage zu den Buttons in FXML AWT, Swing, JavaFX & SWT 1
I Grundsätzliche Frage zu ItemListener AWT, Swing, JavaFX & SWT 11
X Kurze Frage zu JPopup AWT, Swing, JavaFX & SWT 3
D Swing [Frage] ComboBox + Label AWT, Swing, JavaFX & SWT 3
D Frage zu JFrame und Graphics AWT, Swing, JavaFX & SWT 4
J Swing Frage zur Vorgehensweise (JTable?, JLabels?) AWT, Swing, JavaFX & SWT 8
S Frage zu Jtable / CellEditor AWT, Swing, JavaFX & SWT 1
kaoZ Frage zum einfügen von Componenten AWT, Swing, JavaFX & SWT 14
N Swing JTable anfänger frage AWT, Swing, JavaFX & SWT 2
S GridBagLayout-Frage AWT, Swing, JavaFX & SWT 1
V 2D-Grafik Frage zum Graphics Objekt AWT, Swing, JavaFX & SWT 2
F Swing JComboBox - Frage zur Größe AWT, Swing, JavaFX & SWT 11
G noch eine Frage zum EventDispachThread AWT, Swing, JavaFX & SWT 4
D MVC Frage AWT, Swing, JavaFX & SWT 6
Z Flackern trotz Offscreen Image / Doublebuffer, (+ Frage zu Pixelvergleich) AWT, Swing, JavaFX & SWT 25
GianaSisters 2D-Grafik BufferedImage.getSubimage - Frage AWT, Swing, JavaFX & SWT 7
M Frage zu KeyListener bzgl. JApplet AWT, Swing, JavaFX & SWT 3
M Frage zu Threads AWT, Swing, JavaFX & SWT 3
N Swing JComboBox Frage AWT, Swing, JavaFX & SWT 5
Luk10 g.drawString funktioniert nicht + Frage zur Text-Rendering Qualität AWT, Swing, JavaFX & SWT 7
Luk10 Frage zu Farb-Komposition AWT, Swing, JavaFX & SWT 9
K Gui Layout Frage AWT, Swing, JavaFX & SWT 5
V SWT Import Wizard - frage zur WizardPage AWT, Swing, JavaFX & SWT 5
N Swing Frage JXMapviewer AWT, Swing, JavaFX & SWT 4
GUI-Programmer Wieder ne Layout Frage AWT, Swing, JavaFX & SWT 11
GUI-Programmer LayoutManager Kurze Layout Frage - eine komponente mittig? AWT, Swing, JavaFX & SWT 5
lumo SWT Zeichnen bescheunigen bzw eine allg. Frage AWT, Swing, JavaFX & SWT 8
H Frage zu übergebenem Vector bzw. Boolean AWT, Swing, JavaFX & SWT 3
C 2D-Grafik BufferedImage laden, Frage zum Code AWT, Swing, JavaFX & SWT 2
VfL_Freak Swing Frage zu "new JPasswordField( 10 )" AWT, Swing, JavaFX & SWT 6
H Frage zu WindowBuilder Pro AWT, Swing, JavaFX & SWT 3
C Frage/Problem mit Jpanel AWT, Swing, JavaFX & SWT 4
S Frage zu TextArea AWT, Swing, JavaFX & SWT 2
GUI-Programmer Zeichnen in Swing - Frage AWT, Swing, JavaFX & SWT 6
Luk10 Frage zu Mouseevents AWT, Swing, JavaFX & SWT 7
J Refreshing Swing Frage AWT, Swing, JavaFX & SWT 10
F Frage zu Event KeyTyped bei jPanel AWT, Swing, JavaFX & SWT 4
A Frage zu StringBuilder AWT, Swing, JavaFX & SWT 2
S allg. Frage zur GUI-Architektur AWT, Swing, JavaFX & SWT 5
A Frage zu JDialog AWT, Swing, JavaFX & SWT 3
A Frage zur Methode matches() AWT, Swing, JavaFX & SWT 2
P LayoutManager Verständnis-Frage GridBagLayout AWT, Swing, JavaFX & SWT 7
H Allgemeine Frage zu Grafikfähigkeiten von Java AWT, Swing, JavaFX & SWT 24
D Repaint Frage, Design Frage AWT, Swing, JavaFX & SWT 2
Jats Frage zu JLabel & JTextField AWT, Swing, JavaFX & SWT 4
Y frage zu BufferedImage AWT, Swing, JavaFX & SWT 7
hdi Swing Frage zu invokeAndWait() Exceptions AWT, Swing, JavaFX & SWT 8
P Swing Frage zu paintComponent/getGraphics AWT, Swing, JavaFX & SWT 4
M Frage nach Swing Element AWT, Swing, JavaFX & SWT 3
S Frage zu Graphics2D AWT, Swing, JavaFX & SWT 3
T AWT Frage zu AWT AWT, Swing, JavaFX & SWT 5
F unspezifizierte Frage zu JTable/ Model AWT, Swing, JavaFX & SWT 6
B SWT Frage zu MVC und Data-Binding AWT, Swing, JavaFX & SWT 8
T LookAndFeel Look and Feel Frage AWT, Swing, JavaFX & SWT 2
J Java2D Kreis/Kurven Frage AWT, Swing, JavaFX & SWT 2
P Kurze Frage zur Gestaltung eines vertikalen Menüs AWT, Swing, JavaFX & SWT 2
Dit_ Frage zum Thema SwingUtilities.invokeLater AWT, Swing, JavaFX & SWT 5
Eldorado Frage zur Anwendung des MVC-Konzept AWT, Swing, JavaFX & SWT 33
G Frage zu processMouseEvent AWT, Swing, JavaFX & SWT 6
M Zoomen in ein JPanel... und eine andere kleine Frage AWT, Swing, JavaFX & SWT 3
D Swing implementierungs-technische Frage zu JList/AbstractListModel AWT, Swing, JavaFX & SWT 7
C Event Frage AWT, Swing, JavaFX & SWT 7
A Frage zu GridLayout AWT, Swing, JavaFX & SWT 4
F Frage zu WindowListeners AWT, Swing, JavaFX & SWT 2
E einfache Frage:warum ist Hintergrund grau ? AWT, Swing, JavaFX & SWT 24
E einfache Frage zu paintComponent und Graphics AWT, Swing, JavaFX & SWT 7
C Frage zu ActionListenern AWT, Swing, JavaFX & SWT 7
D Frage @ someActionEvent.getActionCommand() AWT, Swing, JavaFX & SWT 2
Kr0e Allgemeine Frage zu Java2D (Eigene Impl.) AWT, Swing, JavaFX & SWT 18
L Einfache Layout Frage für Applet -> Was mache ich bloss falsch? AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben