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