码迷,mamicode.com
首页 > 编程语言 > 详细

解决JAVA Process死锁

时间:2019-09-20 18:26:14      阅读:95      评论:0      收藏:0      [点我收藏+]

标签:get   reader   ror   void   命令   不能   edr   缓冲区   进程   

主进程调用Process.waitfor后已挂起。当前子进程和主进程之间的缓冲区塞满后,子进程不能继续写数据,然后也会挂起。

需要获取Process.getInputStream和Process.getErrorStream并处理。

    // 处理子进程输出的线程,防止死锁
    static class StreamHandler extends Thread {

        private InputStream in;

        public StreamHandler(InputStream in) {
            this.in = in;
        }

        public void run() {
            try {
                BufferedReader reader = new BufferedReader(
                        new InputStreamReader(in));
                String line = null;
                while ((line = reader.readLine()) != null) {
                    System.out.println(line);
                }
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
        }
    }

           ProcessBuilder pb = new ProcessBuilder();
            // 添加命令
            pb.command(cmd);
            // 重定向错误输出,将错误输出合并到inputStream
            pb.redirectErrorStream(true);
            // 启动子进程
            Process p = pb.start();
            // 启动协助进程的子线程,将Process的inputStream输出,防止死锁
            new StreamHandler(p.getInputStream()).start();
            // 开始执行
            int w = p.waitFor();
            p.destroy();                    

 

解决JAVA Process死锁

标签:get   reader   ror   void   命令   不能   edr   缓冲区   进程   

原文地址:https://www.cnblogs.com/guofx/p/11558609.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!