java如何阻止SwingWorker。立即进行后台处理?
根据甲骨文docsSwingWorker.doInBackground
不包括任何可能抛出InterruptedException
的代码。不知道我的理解是否正确,但我注意到取消doInBackground
进程会打印出InterruptedException
,因此即使遇到Exception
它也会继续。那么我们如何立即取消并停止该进程呢
所以我尝试了return STATUS;
当它被取消时,但仍在继续。我也试过PROCESS.destroyForcibly()
在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);
});
共 (0) 个答案