【问题标题】:application not responding using ProcessBuilder应用程序使用 ProcessBuilder 没有响应
【发布时间】:2015-02-18 08:38:01
【问题描述】:

我目前正在做一个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 asynchronous processbuilder


    【解决方案1】:

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

    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() 似乎没有为 Executors 定义,使用 java.util.concurrent.Executors 并且 scriptCMD 需要设置为 final 应该可以吗?
    • 忘记最后一条评论,eclipse restart 解决了这个问题。感谢您快速可靠的回答!像魅力一样工作
    • 是的,方法的参数应该设置为final,没什么不好的。
    猜你喜欢
    • 2017-04-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多