Java SwingWorker не завершается при завершении задачи

Хорошо, яЯ немного поигрался с SwingWorker и получил упрощенный код для обновления графического интерфейса, но яЯ не могу понять, как заставить поток правильно завершиться после его завершения. В настоящее время он завершается только через опцию остановки. Как бы я настроить его, чтобы также правильно завершить поток, когда он заканчивает свой процесс? В настоящее время послеreturn null; он идет к линии упаковки и зависает.

Мой код ниже:

    package concurrency;

import java.util.List;
import java.util.Random;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;

public class PBTest extends JFrame implements ActionListener {
    private final GridBagConstraints constraints;
    private final JProgressBar pb, pbF;
    private final JButton theButton;
    private PBTask pbTask;

    private JProgressBar makePB() {
        JProgressBar p = new JProgressBar(0,100);
        p.setValue(0);
        p.setStringPainted(true);
        getContentPane().add(p, constraints);
        return p;       
    }

    public PBTest() {
        super("PBTest");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Make text boxes
        getContentPane().setLayout(new GridBagLayout());
        constraints = new GridBagConstraints();
        constraints.insets = new Insets(3, 10, 3, 10);

        pb = makePB();
        pbF = makePB();

        //Make buttons
        theButton = new JButton("Start");
        theButton.setActionCommand("Start");
        theButton.addActionListener(this);
        getContentPane().add(theButton, constraints);

        //Display the window.
        pack();
        setVisible(true);
    }

    private static class UpdatePB {
        private final int pb1, pb2;
        UpdatePB(int pb1s, int pb2s) {
            this.pb1 = pb1s;
            this.pb2 = pb2s;
        }
    }

    private class PBTask extends SwingWorker {
        @Override
        protected Void doInBackground() {
            int prog1 = 0;
            int prog2 = 0;
            Random random = new Random();

            while (prog2 < 100) {
                if(prog1 >= 100) {
                    prog1 = 0;
                }
                //Sleep for up to one second.
                try {
                    Thread.sleep(random.nextInt(1000));
                } catch (InterruptedException ignore) {}
                //Make random progress.
                prog1 += random.nextInt(10);
                prog2 += random.nextInt(5);
                publish(new UpdatePB(prog1, prog2));
            }
            return null;
        }

        @Override
        protected void process(List pairs) {
            UpdatePB pair = pairs.get(pairs.size() - 1);
                pb.setValue(pair.pb1);
                pbF.setValue(pair.pb2);
        }
    }

    public void actionPerformed(ActionEvent e) {
        if ("Start" == e.getActionCommand() && pbTask == null) {
            theButton.setText("Stop");
            theButton.setActionCommand("Stop");
            (pbTask = new PBTask()).execute();
        } else if ("Stop" == e.getActionCommand()) {
            theButton.setText("Start");
            theButton.setActionCommand("Start");
            pbTask.cancel(true);
            pbTask = null;
        } else {
            alertMsg("Thread still running.");
        }

    }

    static void alertMsg(String theAlert) {
        JOptionPane.showMessageDialog(null, theAlert);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new PBTest();
            }
        });
    }
}

Примечание: это в основном изменение учебников по Java "флиппер" пример ... яЯ не столько программист, сколько хакер кода (/ sad face /, lol), на данный момент яЯ в растерянности относительно того, куда идти дальше.

В любом случае, код работает так, как задумано, пока не завершится. Я пытался добавитьdone() метод, но он никогда не пытается запустить его, он всегда просто идет в строку пакета (при переходе через отладчик) и зависает. Я должен вернуть значение, отличное от нуля или что-то?

Заранее благодарю за любую помощь!

Ответы на вопрос(2)

Ваш ответ на вопрос