【问题标题】:How to run command line within java using thread async如何使用线程异步在java中运行命令行
【发布时间】:2011-05-12 03:58:20
【问题描述】:

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


    【解决方案1】:

    我认为您有充分的理由希望从另一个 java 程序运行一个 java 程序,而不仅仅是从 shell 脚本,或者通过调用 API - 但如果不是 - 请重新考虑。

    至于您的问题 - 如果您的应用程序产生大量输出(您作为进程运行的输出) - 您的应用程序将挂起。 p.waitFor() 将停止直到进程结束。但是如果你不阅读来自InputStream 的信息 - 它会溢出并挂起!

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-14
      • 2021-11-06
      • 2010-12-17
      • 1970-01-01
      • 2017-08-18
      • 2021-01-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多