如何在 SwingWorker 的 doInBackground() 中停止调用的静态方法

How to stop a called static method in doInBackground() of SwingWorker

我有一个名为 Task1 的 SwingWorker,

class Task1 extends SwingWorker<Void, Void> {
        @Override
        public void doInBackground() {
            String[] args = {};
            try {
                FeatureSetBuilder.main(args); //<---It is a static method


            } catch (Exception e1) {
                e1.printStackTrace();
            }

            return null;
        }
        public void done() {

            UISettings.FP_GENERATOR_DIALOG_2.cancelButton.setEnabled(true);
            loadingDialog.progressBar.setIndeterminate(false);
            loadingDialog.setVisible(false);
        }
    }

我有一个将执行 Task1 的按钮,

         public void actionPerformed(ActionEvent e) {
                System.out.println("FeatureSetBuilder - Start");
                String[] args = {};
                try {
                    task1 = new Task1();
                    task1.execute();
                    loadingDialog.popOut(task1);
                    task1.cancel(true);



                } catch (Exception e1) {
                    e1.printStackTrace();
                }
                System.out.println("FeatureSetBuilder - Finished");

            }

当我点击这个按钮时,会弹出一个带有进度条的对话框,表明方法 FeatureSetBuilder.main(args) 是 运行。当 task1 完成时,将调用 done() 方法并关闭该对话框。

它工作正常。

我想在该对话框中添加一个取消按钮,以便用户可以随时终止任务 1。

这是我的取消按钮,

 cancelButton.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    System.out.println("Stop the current SwingWorker");
                    task.cancel(true);
                    setVisible(false);
                }
            });

当我按下“取消”按钮时,任务 1 似乎被终止,因为 "FeatureSetBuilder - Finished" 被打印出来了。但是,静态方法FeatureSetBuilder.main(args) 仍然是运行。

您的 doInBackground 方法应该定期检查任务是否已被取消。来自 SwingWorker class' javadoc 的示例:

@Override
public List<Integer> doInBackground() {
    while (! enough && ! isCancelled()) {
            number = nextPrimeNumber();
            publish(number);
            setProgress(100 * numbers.size() / numbersToFind);
        }
    }
    return numbers;
}

我强烈建议您阅读 SwingWorker 和相关 class 中所有 classes/methods 的 javadoc。 EventDispatchThread 相关问题可能非常棘手。