如何在Java中使用线程异步运行命令行

4

我是Java新手。我的任务是编写Java程序来运行命令行。由于我还没有访问Linux服务器,所以我在DOS提示符下测试了命令行,它运行得很好。完整的命令行语法请参见下面的程序。该任务将需要6个输入文件,并生成一些输出文件。接下来,我尝试创建一个类并使用getruntime和process来处理这个工作。即使它编译时没有错误,但当我运行它时,只会显示光标闪烁...我认为我需要使用线程异步技术。请给我一些建议,因为我没有足够的时间来完成这个项目。当任务完成时,我还想实现回调或返回值。如果有示例,将不胜感激。谢谢。

import java.io.*;
 public class RunJob {

 // public static final String PROGRAM = "c:\\wrk\\java.exe Hello";

//one command line below
 public static final String PROGRAM = "c:/java.exe -cp \"wrk/jmp.jar;wrk/colt.jar\"   gov.lanl.yadas.reliability.UltimateMissileReliabilityModel 10000 \"wrk/\" x1.dat x2c.dat x3.dat   x4.dat x5.dat x6.dat true";

 //  Set to true to end the loop 
 static boolean done = false;

public static void main(String argv[]) throws IOException {

    BufferedReader is;   
    String line;
    String returnMsg = "Start ";
    final Process p = Runtime.getRuntime().exec(PROGRAM);
     System.out.println("start");


    Thread waiter = new Thread() {
      public void run() {
        try {
          p.waitFor();
        } catch (InterruptedException ex) {
        System.out.println("InterruptedException");
          return;
        }
        System.out.println("Program terminated!");
        done = true;
      }
    };
    waiter.start();
   is = new BufferedReader(new InputStreamReader(p.getInputStream()));

    while (!done && ((line = is.readLine()) != null))
      {
      System.out.println(line);
      returnMsg = returnMsg + line;      
      } 
      System.out.println(returnMsg);
        System.out.println("End");

     return;
  }// main


}
1个回答

3

我假设你有充分的理由想要从另一个Java程序中运行Java程序,而不是通过Shell脚本或调用API来运行它。但如果没有,请重新考虑。

至于你的问题——如果你的应用程序(作为进程运行的那个)产生了大量输出,它就会挂起。 p.waitFor()将一直等待进程结束。但如果你不从InputStream中读取信息,它就会溢出并挂起!

建议 #1:将p.waitFor()放在最后。
建议 #2:阅读这篇文章。如果我没记错的话,这就是我遇到类似问题时阅读的文章。你也可以搜索“StreamGobbler”——这是一个常见的名称,用于描述一个独立的线程,用于“吞噬”你的流。
建议 #3:别忘了ErrorStream——如果你的应用程序产生了太多错误,那个流也会导致进程挂起。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接