繁体   English   中英

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

[英]How to run command line within java using thread async

我是java的新手。 我的任务是编写java程序来运行命令行。 我在DOS提示符下测试了命令行,因为我还没有访问Linux机箱。 它工作得很好。 有关完整的命令行语法,请参阅下面的PROGRAM。 该作业将采用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


}

我假设你有一个很好的理由想要从另一个java程序运行java程序,而不仅仅是从shell脚本运行,或者通过调用API - 但如果没有 - 请重新考虑。

至于你的问题 - 如果你的应用程序产生大量输出(你作为一个进程运行的那个) - 你的应用程序将挂起。 p.waitFor()将暂停,直到进程结束。 但是如果你没有从InputStream读取信息 - 它会溢出并挂起!

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM