当我通过 java 应用程序中的进程运行 pg_restore
时,应用程序卡住和信息消息不显示,但进程已成功完成。为什么会这样?我使用 PostgreSQL 9.2。
方法代码:
private void restoreDB() {
JFileChooser fileopen = new JFileChooser();
FileNameExtensionFilter filter = new FileNameExtensionFilter("DB FILES", "sql");
fileopen.addChoosableFileFilter(filter);
fileopen.setCurrentDirectory(new java.io.File("C:/backups/"));
fileopen.setDialogTitle("Выберите папку для резервной копии");
fileopen.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
fileopen.setAcceptAllFileFilterUsed(false);
int ret = fileopen.showDialog(null, "Restore DB");
if (ret == JFileChooser.APPROVE_OPTION) {
File file = fileopen.getSelectedFile();
try {
String path = file.getAbsolutePath();
System.out.println(path);
String user = "postgres";
String dbName = "Auto";
String executeCmd = "pg_restore -i -U " + user + " -d " + dbName+" -v "+ path;
Process runtimeProcess;
runtimeProcess = Runtime.getRuntime().exec(executeCmd);
int processComplete = runtimeProcess.waitFor();
if (processComplete == 0) {
javax.swing.JOptionPane.showMessageDialog(null, "Successfull!");
log.info("Successfull!");
} else {
javax.swing.JOptionPane.showMessageDialog(null, "Unsuccessfully");
log.info("Unsuccessfully");
}
}catch (Exception ex) {
ex.printStackTrace();
}
}
}
最佳答案
不要阻塞 EDT(事件调度线程)——当发生这种情况时,GUI 将“卡住”。不是调用 Thread.sleep(n)
而是实现一个 Swing Timer
用于重复任务或一个 SwingWorker
用于长时间运行的任务。参见 Concurrency in Swing了解更多详情。
关于java - 当我通过 java 应用程序中的进程运行 pg_restore 时,应用程序卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20749614/