【发布时间】:2013-12-06 12:29:53
【问题描述】:
如何在 Java 中执行进程而不冻结程序? 我尝试过使用 SwingWorker,但我还不太明白它是如何工作的。
我还有其他方法可以做到这一点吗?我想在我的 JDroidLib 中使用类似的东西。如需完整源代码,请查看 GitHub:http://github.com/Team-M4gkBeatz/JDroidLib
提前致谢!
编辑:
感谢您的回答。但是我有一个有几种方法的类(嗯,它不止一个类,但你明白我的意思);我如何使用 SwingWorker 与这些交互?
这是其中一类:
/**
*
* @author Simon
*/
public abstract class Command extends SwingWorker {
BufferedReader prReader = null;
ProcessBuilder process = null;
Process pr = null;
Date timeNow = new Date();
String osName = System.getProperty("os.name");
public void executeProcessNoReturn(String _process, String arg) throws IOException {
process = new ProcessBuilder(_process, arg);
pr = process.start();
}
public String executeProcessReturnLastLine(String _process, String arg) throws IOException {
process = new ProcessBuilder(_process, arg);
pr = process.start();
prReader = new BufferedReader(new InputStreamReader(pr.getInputStream()));
String line;
while ((line = prReader.readLine()) != null) {
// Wait for input to end.
}
return line;
}
public StringBuilder executeProcessReturnAllOutput(String _process, String arg) throws IOException {
process = new ProcessBuilder(_process, arg);
pr = process.start();
prReader = new BufferedReader(new InputStreamReader(pr.getInputStream()));
StringBuilder output = null;
String line;
while ((line = prReader.readLine()) != null) {
output.append(line);
}
return output;
}
public boolean isProcessRunning(String processName) throws IOException {
boolean value = false;
if (osName.equals("Linux") | osName.contains("Mac")) {
process = new ProcessBuilder("ps", "-e");
pr = process.start();
String line;
prReader = new BufferedReader(new InputStreamReader(pr.getInputStream()));
while ((line = prReader.readLine()) != null) {
if (line.contains(processName)) { value = true; break; }
}
} else {
String winDir = System.getenv("windir") + "/System32/tasklist.exe";
process = new ProcessBuilder(winDir);
pr = process.start();
String line;
prReader = new BufferedReader(new InputStreamReader(pr.getInputStream()));
while ((line = prReader.readLine()) != null) {
if (line.contains(processName)) { value = true; break; }
}
}
return value;
}
public String executeProcessReturnError(String processName, String arg) throws IOException {
process = new ProcessBuilder(processName, arg);
process.redirectError();
pr = process.start();
prReader = new BufferedReader(new InputStreamReader(pr.getErrorStream()));
String line;
String output = "";
while ((line = prReader.readLine()) != null) {
output += line + "\n";
}
return output;
}
}
【问题讨论】:
-
StringWorker是正确的方法。它应该为任务创建单独的线程,让 GUI 线程正常工作。请查看official tutorial 以了解有关如何使用它的更多信息。 -
也不要发布指向您的代码的链接,而是在此处发布相关部分,或者更好地创建SSCCE,我们可以使用它来重现您的问题。
标签: java swing swingworker