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

标签 java multithreading swing swingworker

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 后控制台输出:

true

true

所以,工作人员已经完成了,但程序仍然继续显示毫秒。什么是死后生命?如果使用 Thread 则相同:方法 isAlive() 返回“false”。

最佳答案

根据您的代码,您似乎需要一个带有循环的工作线程来继续运行,直到主线程告诉它停止运行,这是通过 worker.cancel(true); 完成的。问题是您正在取消它,但没有采取任何措施来指示循环本身停止迭代。要解决此问题,您应该更改

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

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

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

isCancelled()

Returns true if this task was canceled before it completed normally. Since the loop never closes on its' own, it will never complete normally.

关于java - 在这种情况下,当我想停止 SwingWorker 时,我做错了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55247297/

相关文章:

java - 使用 auto-factory 生成的工厂无法导入 glide 生成的 api

java - 如何修复这个竞争条件错误?

java - 如何使用java中的多线程对记录列表进行排序?

java - 如何在 JFrame 中的 JPanel 之间切换

Java 检查输入是整数还是空以允许默认值

java - 尝试解析 JSON 数据时通过递归调用在 Android 中获取 StackOverFlowError

java - 为什么只有带前缀返回类型的 java 方法才会执行?

c++ - tbb:concurrent_unordered_map() - vector 中每个唯一元素的 ID?

java - 如何用数字绘制 JButton 的角?

java - 如何在关闭JInternalFrame之前询问 "Are you sure?"?