Java 应用程序未使用ProcessBuilder响应

Java 应用程序未使用ProcessBuilder响应,java,asynchronous,processbuilder,Java,Asynchronous,Processbuilder,我目前正在做一个Eclipse插件,主要是调用各种脚本并与返回值交互 我的主要问题是ProcessBuilder。如果我调用一个正在创建新的Visual Basic窗口的脚本,在关闭VB窗口之前,我将无法再与插件交互。似乎cmd命令仍在后台运行,只有在它停止后插件才会再次响应 我怎样才能修好它?它应该以任何方式异步运行吗 这是我正在使用的ProcessBuilder: public void execute(String scriptCMD) { try { ProcessBuild

我目前正在做一个Eclipse插件,主要是调用各种脚本并与返回值交互

我的主要问题是ProcessBuilder。如果我调用一个正在创建新的Visual Basic窗口的脚本,在关闭VB窗口之前,我将无法再与插件交互。似乎cmd命令仍在后台运行,只有在它停止后插件才会再次响应

我怎样才能修好它?它应该以任何方式异步运行吗

这是我正在使用的ProcessBuilder:

public void execute(String scriptCMD) {
  try {
    ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/c",
        scriptCMD);
    pb.redirectErrorStream(true);
    Process p = pb.start();
    BufferedReader r = new BufferedReader(new InputStreamReader(
        p.getInputStream()));
    String line;
    while (true) {
      line = r.readLine();
      if (line == null) {break;}
      System.out.println(line);
    }
  } catch (IOException e) {
    e.printStackTrace();
    }
}

下面是一个在另一个线程中异步执行流程的简单示例。我使用单线程执行器是因为只执行一个任务:

java.util.concurrent.Executors.newSingleThreadExecutor().execute(new Runnable() {
  public void run() {
    ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/c",
        scriptCMD);
    pb.redirectErrorStream(true);
    Process p = pb.start();
    BufferedReader r = new BufferedReader(new InputStreamReader(
        p.getInputStream()));
    String line;
    while (true) {
      line = r.readLine();
      if (line == null) {break;}
      System.out.println(line);
    }
  }
});

感谢两件事:newSingleThreadedExecutor()对于执行者来说似乎没有定义,使用java.util.concurrent.Executors和scriptCMD需要设置为final应该可以吗?忘记最后的注释,eclipse重启修复了这个问题。谢谢你快速可靠的回答!就像一个charmYes,方法的参数应该设置为final,没有什么不好的。