等待一个用java语言用c++编写的多线程程序

nmpmafwu  于 2021-07-14  发布在  Java
关注(0)|答案(1)|浏览(282)

我用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 在程序中不要打印太多。
所以我的问题是:我如何才能等待真正所有的线程?我怎样才能得到程序的真正输出呢?

bihw5rsg

bihw5rsg1#

您的程序不会从c程序获得所有输出,因为它在输入流耗尽之前不会读取。它跳到 waitFor 如果c程序在达到 is.available() .
这里有另一种方法在输入流关闭之前进行读取。它使用一个 InputStreamReader 和一个 BufferedReader 打电话给 BufferedReaderreadline() 直到输入流关闭。
免责声明。我以前没有写过任何java程序,所以我不确定我是否把所有的东西都写对了。不过,总的想法应该行得通。

var v2j = new ProcessBuilder("./src/main/cpp/vcd_converter", "-vcd", 
                             vcdfilePath, "-out", logfilePath).start();

InputStream is = v2j.getInputStream();
try(var reader = new BufferedReader(new InputStreamReader(is))) {
    String line;

    while ((line = reader.readLine()) != null) {
        System.out.println("Input: " + line);
    }
}

InputStream es = v2j.getErrorStream();
try(var reader = new BufferedReader(new InputStreamReader(es))) {
    String line;

    while ((line = reader.readLine()) != null) {
        System.out.println("Error: " + line);
    }
}

v2j.waitFor();

相关问题