美文网首页
Java多线程中开启另一个进程的阻塞问题

Java多线程中开启另一个进程的阻塞问题

作者: 大数据ZRL | 来源:发表于2020-04-29 17:24 被阅读0次
    • Process阻塞原因

      • 输入流和错误流分开的,没有处理,缓存堆积就会发生阻塞,归根结底本质上是io阻塞问题
    • Process.getInputStream

      • 获取子进程中的标准输出
    • Process.getErrorSteam

      • 获取子进程中的标准错误输出
    • Process原理

      • 使用Runtime.getRuntime().exec("cmd")会在当前进程建立一个子进程,子进程由于没有控制台,它的标准输出和标准错误就会返回给父进程Process,因此通过getInputStream和getErrorStream就可以获取到这些信息
    • 最佳解决办法

    String s;
    String shellCmd = "python demo.python Tom 18 male"
    String[] shellCmd1 = shellCmd.split(" ");
    ProcessBuilder builder = new ProcessBuilder(shellCmd1);
    builder.redirectErrorStream(true); //将子进程的标准错误流与标准输出流合并
    process = builder.start();
    // 获取子进程的标准输出
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
    while ((s = bufferedReader.readLine()) != null) {
            System.out.println(s);
           }
    int resultCode = process.waitFor();
    System.out.println(resultCode);
    
    • 注意: 使用new ProcessBuilder(shellCmd1)时, shellCmd1必须被转化为字符串数组, 否则会报"python demo.python Tom 18 male" file or directory not found的错误

    参考:https://blog.csdn.net/weixin_33860722/article/details/91372266?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1

    相关文章

      网友评论

          本文标题:Java多线程中开启另一个进程的阻塞问题

          本文链接:https://www.haomeiwen.com/subject/cbsnwhtx.html