我用c++编写了一个程序,其中使用了多线程。用bash脚本或者类似的东西调用这个程序没问题,一切都正常。现在我想用java调用这个程序。这是我尝试的java代码示例:
Process v2j = new ProcessBuilder("./src/main/cpp/vcd_converter",
"-vcd", vcdfilePath, "-out", logfilePath).start();
InputStream is = v2j.getInputStream();
InputStream es = v2j.getErrorStream();
for(int i = 0; i < is.available(); i++) {
System.out.println("Input: " + br.readLine());
}
for(int i = 0; i < es.available(); i++) {
System.out.println("Error: " + ebr.readLine());
}
v2j.waitFor();
所以如果我运行这个代码,就会发生以下情况:看起来 waitFor()
指令不会真正等待“所有”线程,也许它只会等待一个线程。但是,java程序执行时出错,因为它找不到c程序生成的文件。所以 waitFor()
不要等到我的c程序完成并生成了文件。
输出也很奇怪。我只从中得到一个输出 std::cout
. 举个例子:
std::cout << out_folder_path << "\n" << vcd_filename << "\n";
std::cout << std::flush;
这将只打印 out_folder_path
输出。问题是:在 std::cout
我甚至不使用多线程。所有其他 std::cout
在程序中不要打印太多。
所以我的问题是:我如何才能等待真正所有的线程?我怎样才能得到程序的真正输出呢?
1条答案
按热度按时间bihw5rsg1#
您的程序不会从c程序获得所有输出,因为它在输入流耗尽之前不会读取。它跳到
waitFor
如果c程序在达到is.available()
.这里有另一种方法在输入流关闭之前进行读取。它使用一个
InputStreamReader
和一个BufferedReader
打电话给BufferedReader
的readline()
直到输入流关闭。免责声明。我以前没有写过任何java程序,所以我不确定我是否把所有的东西都写对了。不过,总的想法应该行得通。