解决JAVA Process死锁

Posted guofx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解决JAVA Process死锁相关的知识,希望对你有一定的参考价值。

主进程调用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死锁的主要内容,如果未能解决你的问题,请参考以下文章

Process的Waitfor() 引起代码死锁

Java process.getInputStream() 没有啥可读的,死锁子

SQL Server 死锁

SQL SERVER - 谈死锁的监控分析解决思路

MySQL表不能修改删除等操作,卡死锁死情况的处理办法。

一次简单的死锁分析