这是我的主类,其中run(),我正在调用另一种用于exe文件的方法install setup()。
public static void main(String[] args) {
launch(args);
}
public void startSetup() {
Runnable task=new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
installSetup();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
Thread thread=new Thread(task);
thread.start();
}
这是我的installsetup()方法
public void installSetup() {
try {
Runtime.getRuntime().exec("cmd /c C:path\\setup.exe", null, new File("C:pathfolder\\01_Setupexe"));
//process.waitFor();
} catch (IOException e) {
e.printStackTrace();
}
};
我在控制器类中这样调用它:
public class Controller extends Thread {
@FXML
private ComboBox<?> dsetup;
public void generateRandom() {
if(dsetup.getValue()!=null) dsetupValue = dsetup.getValue().toString();
if(dsetupValue!=null)call.startSetup();
在我仅使用exec方法而不是线程概念调用安装文件之前,该应用程序运行良好,但是它一次执行了所有.exe文件,然后界面冻结。因此,现在我正在使用线程概念,并尝试一次实现一个线程。我不知道这是不是一种错误的方法,但是在控制台中没有出现任何错误。
答案 0 :(得分:3)
Runtime.exec已经过时很多年了。请改用ProcessBuilder:
ProcessBuilder builder = new ProcessBuilder("C:\\path\\setup.exe");
builder.directory(new File("C:pathfolder\\01_Setupexe"));
builder.inheritIO();
builder.start();
inherentIO()方法将使生成的进程使用Java程序的stdin,stdout和stderr,因此它不会挂起等待输入或等待可用的输出缓冲区。
我怀疑您是否需要新的线程或sleep调用,但是我不知道您正在调用哪些文件,或者它们是否相互依赖。
答案 1 :(得分:0)
可悲的是,执行人员有一些陷阱。大多数情况下,使用过程aproche(请参见清单4.3)可以使我避免与缓冲区问题等相关的事情。 https://www.javaworld.com/article/2071275/core-java/when-runtime-exec---won-t.html
import java.util.*; import java.io.*; public class MediocreExecJavac { public static void main(String args[]) { try { Runtime rt = Runtime.getRuntime(); Process proc = rt.exec("javac"); InputStream stderr = proc.getErrorStream(); InputStreamReader isr = new InputStreamReader(stderr); BufferedReader br = new BufferedReader(isr); String line = null; System.out.println("<ERROR>"); while ( (line = br.readLine()) != null) System.out.println(line); System.out.println("</ERROR>"); int exitVal = proc.waitFor(); System.out.println("Process exitValue: " + exitVal); } catch (Throwable t) { t.printStackTrace(); } } }
来源:javaworld