zoukankan      html  css  js  c++  java
  • Java调用python脚本,进程长时间卡住

    启动shell进程后,发现进程长时间运行无法结束,同时失去响应。这个问题的原因是shell脚本或者命令在运行的过程中会向标准输出或者标准错误输出写出数据,但JVM又没有去读,导致缓冲区满,进而导致进程阻塞。这个问题的解决的方法比较简单,既然问题是缓冲区满之后没有及时清理,那么只要在Java代码里去读一下数据,保证缓冲区不会满即可.

    public static void executeCMD(final String cmdStrArr) {
    		Runtime rt = Runtime.getRuntime();
    		System.out.println("开始执行脚本");
    		System.out.println("脚本内容为:" + cmdStrArr);
    
    		try {
    			Process p = rt.exec(cmdStrArr);
    			// 防止缓冲区满, 导致卡住
    			new Thread() {
    				@Override
    				public void run() {
    					super.run();
    					String line;
    					try {
    						BufferedReader stderr = new BufferedReader(new InputStreamReader(p.getErrorStream()));
    						while ((line = stderr.readLine()) != null) {
    							System.out.println("stderr:" + line);
    						}
    					}
    					catch (Exception e) {
    
    					}
    
    				}
    			}.start();
    
    
    			new Thread() {
    				@Override
    				public void run() {
    					super.run();
    					String line;
    					try {
    						BufferedReader stdout = new BufferedReader(new InputStreamReader(p.getInputStream()));
    						while ((line = stdout.readLine()) != null) {
    							System.out.println("stdout:" + line);
    						}
    					}
    					catch (Exception e) {
    
    					}
    				}
    			}.start();
    
    
    			int exitVal = p.waitFor();
    			if (0 != exitVal) {
    				System.out.println("执行脚本失败");
    			}
    			System.out.println("执行脚本成功");
    
    		}
    		catch (Exception e) {
    			e.printStackTrace();
    		}
    
    	}
    
  • 相关阅读:
    Redis使用:聚合类型为空时,会自动被Redis删除
    Effective C++: 04设计与声明
    select引起的服务端程序崩溃问题
    Effective C++: 03资源管理
    Effective C++: 02构造、析构、赋值运算
    Effective C++: 01让自己习惯C++
    Centos7.2 安装配置 Tengine(nginx)
    Centos7更新阿里yum源
    Go中函数作为值、类型传递。
    go实现冒泡排序和快速排序
  • 原文地址:https://www.cnblogs.com/weijiqian/p/14831228.html
Copyright © 2011-2022 走看看