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

Java 在这种情况下,当我想阻止SwingWorker时,我做错了什么?,java,multithreading,swing,swingworker,Java,Multithreading,Swing,Swingworker,我试图用Tread编写相同的代码,但它也不起作用。点击停止按钮后的控制台输出: 真的 真的 所以,worker已经完成了,但程序仍然继续显示毫秒。什么是死后生活?如果使用相同的线程:方法isAlive()返回“false”。根据您的代码,看起来您需要一个带循环的辅助线程来保持运行,直到主线程告诉它停止运行,这是通过辅助线程完成的。取消(true)。问题是您正在取消它,但不做任何事情来通知循环本身停止迭代。要解决此问题,您应该更改 public class Form extends JPa

我试图用Tread编写相同的代码,但它也不起作用。点击停止按钮后的控制台输出:

真的

真的


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

根据您的代码,看起来您需要一个带循环的辅助线程来保持运行,直到主线程告诉它停止运行,这是通过
辅助线程完成的。取消(true)。问题是您正在取消它,但不做任何事情来通知循环本身停止迭代。要解决此问题,您应该更改

    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;
    }
}

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

isCancelled()

如果此任务在正常完成之前已取消,则返回true。 由于循环从未自行关闭,因此它将永远无法正常完成


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

    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;
    }
}

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

isCancelled()

如果此任务在正常完成之前已取消,则返回true。 由于循环从未自行关闭,因此它将永远无法正常完成


循环从未终止,因此工作进程从未停止。SwingWorker应该调用isCancelled()方法来检测工作进程是否已取消,然后在doInBackground()方法中退出while循环。您的循环永远不会终止,因此工作进程永远不会停止。SwingWorker应该调用isCancelled()方法来检测工作进程是否已被取消,然后退出doInBackground()方法中的while循环,而不是(;;)
尝试
while(!Thread.interrupted())
(发布方法不检查它)。
for (; ; ) {
    publish(String.valueOf(Calendar.getInstance().getTimeInMillis()));
}
while(!isCancelled()){
    publish(String.valueOf(Calendar.getInstance().getTimeInMillis()));
}