Process.waitFor() 死锁问题了解和解决

转自  https://blog.csdn.net/qq_27948659/article/details/80895860

 public R downLoadFiles(){

        logger.info("执行开始下载命令");
        String cmd = //"hadoop fs -ls /files/ftp/zhihui003/oc_data";
                "hadoop fs -get /files/ftp/zhihui003/* "+fileDir+"";
        //String cmd = "ls  "+fileDir;
        logger.info("downLoadFiles的cmd命令为 :"+cmd);
        // 定时扫描新文件 扫描后处理新文件 分包
        String[] cmds = {"/bin/sh", "-c", cmd };
        Process process=null;

        try {

            process=Runtime.getRuntime().exec(cmds);
            //获取进程的标准输入流
            final InputStream is1 = process.getInputStream();
            //获取进城的错误流
            final InputStream is2 = process.getErrorStream();
            //启动两个线程,一个线程负责读标准输出流,另一个负责读标准错误流
            new Thread() {
                public void run() {
                    BufferedReader br1 = new BufferedReader(new InputStreamReader(is1));
                    try {
                        String line1 = null;
                        while ((line1 = br1.readLine()) != null) {
                            if (line1 != null){
                                logger.info(line1);
                            }
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    finally{
                        try {
                            is1.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }.start();

            new Thread() {
                public void  run() {
                    BufferedReader br2 = new  BufferedReader(new  InputStreamReader(is2));
                    try {
                        String line2 = null ;
                        while ((line2 = br2.readLine()) !=  null ) {
                            if (line2 != null){
                                logger.info(line2);
                            }
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    finally{
                        try {
                            is2.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }.start();

            //可能导致进程阻塞,甚至死锁
            int ret = process.waitFor();
            System.out.println("return value:"+ret);
            System.out.println(process.exitValue());
            logger.info("event:{}", "RunExeForWindows",process.exitValue());
            byte[] bytes = new byte[process.getInputStream().available()];
            process.getInputStream().read(bytes);
            System.out.println(new String(bytes));
            logger.info("event:{}", "RunExeForWindows",new String(bytes));
        }catch (Exception ex){
            ex.printStackTrace();
            try{
                process.getErrorStream().close();
                process.getInputStream().close();
                process.getOutputStream().close();
            }
            catch(Exception ee){
                ee.printStackTrace();
            }
        }
        return R.ok("下载成功");
    }

 

 

 

posted @ 2019-12-02 16:20  huanglei2010  阅读(1319)  评论(0编辑  收藏  举报