Java 如何立即停止SwingWorker.doInBackground进程?

Java 如何立即停止SwingWorker.doInBackground进程?,java,swing,swingworker,Java,Swing,Swingworker,根据OracleSwingWorker.doInBackground不包括任何可能引发InterruptedException“。不知道我的理解是否正确,但我注意到取消doInBackground过程会打印出InterruptedException,因此即使遇到异常它也会继续?那么,我们如何取消并立即停止该过程 所以我试着返回状态当它被取消但仍在继续时。我还尝试了PROCESS.destrobutly()在return之前返回,但仍然是一样的。取消后如何立即停止 import ... publ

根据Oracle
SwingWorker.doInBackground
不包括任何可能引发
InterruptedException
“。不知道我的理解是否正确,但我注意到取消
doInBackground
过程会打印出
InterruptedException
,因此即使遇到
异常
它也会继续?那么,我们如何取消并立即停止该过程

所以我试着
返回状态当它被取消但仍在继续时。我还尝试了
PROCESS.destrobutly()
return
之前返回,但仍然是一样的。取消后如何立即停止

import ...

public class Test {

    private BackgroundProcess BG_PROCESS;
    private JFileChooser FILE_CHOOSER;
    private JProgressBar PROGRESS_BAR;


    public Test() {
        initComponents();
    }

    ...

    private class BackgroundProcess extends SwingWorker<Integer, String> {

        private int STATUS;

        @Override
        protected Integer doInBackground() throws Exception {

            File[] SELECTED_FILES = FILE_CHOOSER.getSelectedFiles();

            for (int i = 0; i < SELECTED_FILES.length; i++) {

                String file = SELECTED_FILES[i].getAbsolutePath();
                String name = SELECTED_FILES[i].getName();

                String[] command = {"javac", "" +file+ ""};

                try {
                    ProcessBuilder PROCESS_BUILDER = new ProcessBuilder(command);
                    Process PROCESS = PROCESS_BUILDER.start();
                    if (!isCancelled()) {
                        STATUS = PROCESS.waitFor();
                        if (STATUS == 0) {
                            TEXTAREA.append(name+ "Successfully compiled.");
                        } else {
                            TEXTAREA.append(name+ "Failed. (not compiled)");
                        }
                    } else {
                        TEXTAREA.append("Compilation cancelled.");
                        return STATUS;
                    }
                    PROCESS.destroy();
                } catch (IOException | InterruptedException ex) {
                    ex.printStackTrace(System.err);
                }
            }

            return STATUS;
        }
    }

    public static void main(String[] args) {
        new Test();
    }
}
取消背景处理

JButton START = new JButton("Start");
START.addActionListener(new ActionListener() {
    @Override
    ...

    BG_PROCESS = new BackgroundProcess();
    BG_PROCESS.execute();
    PROGRESS_BAR.setIndeterminate(true);
});
JButton CANCEL = new JButton("Cancel");
CANCEL.addActionListener(new ActionListener() {
    @Override
    ...

    BG_PROCESS.cancel(true);
    PROGRESS_BAR.setIndeterminate(false);
});

可测试please@HovercraftFullOfEels好的,等等,先生。还不完全清楚:您是要取消
doInBackground
方法,还是要取消从那里开始的
过程?在任何情况下,都可能被重新定义。您知道,使用
SwingWorker
的目的是为了不违反Swing的单线程规则,您在EDT环境之外更新UI,您应该使用
发布
/
过程
methods@MadProgrammer:嗨,欢迎回来!