在这种情况下,当我想停止SwingWorker时,我错了什么?

问题描述 投票:1回答:1
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”。

java multithreading swingworker
1个回答
0
投票

根据您的代码,看起来您需要一个具有循环的worker继续运行,直到主线程告诉它停止运行,这是通过worker.cancel(true);完成的。问题是你正在取消它,但没有做任何事情来通知循环本身停止迭代。要解决这个问题,你应该改变

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

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

请注意java文档中'isCancelled'的措辞:

isCancelled()

如果此任务在正常完成之前被取消,则返回true。由于循环永远不会自行关闭,因此它永远不会正常完成。

© www.soinside.com 2019 - 2024. All rights reserved.