Что я сделал не так, когда я хочу остановить SwingWorker в этом случае? - PullRequest
1 голос
/ 19 марта 2019
public class Worker extends SwingWorker<Integer, String> {
private JLabel screen;

    public Worker(JLabel screen) {
        this.screen = screen;
    }

    @Override
    protected Integer doInBackground() throws Exception {
        for (; ; ) {
            publish(String.valueOf(Calendar.getInstance().getTimeInMillis()));
        }
    }

    @Override
    protected void process(List<String> chunks) {
        screen.setText(chunks.get(0));
    }
}

И в форме:

    public class Form extends JPanel{
    private JButton startButton;
    private JPanel rootPanel;
    private JButton stopButton;
    private JLabel screen;
    private Worker worker;

    public Form() {
        startButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                worker = new Worker(screen);
                worker.execute();
            }
        });
        stopButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                worker.cancel(true);
                System.out.println(worker.isDone());
                System.out.println(worker.isCancelled());
            }
        });
    }

    private void createUIComponents() {
        rootPanel = this;
    }
}

Я пытался написать тот же код с Tread, но он тоже не работает. И вывод консоли после нажатия на stopButton:

правда

правда

Итак, рабочий сделал, но программа все еще продолжает показывать миллисекунды. Что такое жизнь после смерти? И в случае использования Thread тоже самое: метод isAlive () возвращает «false».

1 Ответ

0 голосов
/ 20 марта 2019

Исходя из вашего кода, похоже, что вам нужен рабочий с циклом, чтобы он продолжал работать до тех пор, пока главный поток не скажет ему прекратить работу, что делается с помощью worker.cancel(true);. Проблема в том, что вы отменяете его, но ничего не делаете, чтобы сигнализировать сам цикл о прекращении итерации. Чтобы это исправить, вы должны изменить

for (; ; ) {
    publish(String.valueOf(Calendar.getInstance().getTimeInMillis()));
}

до

while(!isCancelled()){
    publish(String.valueOf(Calendar.getInstance().getTimeInMillis()));
}

Обратите внимание на фразу isCancelled из документации по Java:

isCancelled()

Возвращает true, если это задание было отменено до его нормального завершения. Поскольку цикл никогда не закрывается сам по себе, он никогда не завершится нормально.

...