gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 03:12:50 24 4
gpt4 key购买 nike

我是java新手。我的任务是编写 java 程序来运行命令行。我在 DOS 提示符下测试了命令行,因为我还没有访问 Linux box 的权限。它工作正常。有关完整的命令行语法,请参阅下面的程序。该作业将采用 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:阅读此 article .如果我没记错的话,这是我遇到类似问题时读到的那本书。您还可以在谷歌上搜索“StreamGobbler”——它是“吞噬”您的流的单独线程的通用名称。
建议 #3:不要忘记 ErrorStream - 如果您的应用程序会产生太多错误 - 该流也会导致进程挂起。

关于java - 如何使用线程异步在java中运行命令行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5973146/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com