• 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();
    		}
    
    	}
    
  • 相关阅读:
    线程的五种状态
    ajax回调打开新窗体防止浏览器拦截有效方法
    mysql 如果字段为null自动返回需要的信息sql
    String 与 StringBuffer的区别
    Windows Git中文文件名乱码
    定义函数指针
    hello world
    C++析构函数调用异常问题研究
    企业开发的时候,有可能碰到的问题
    jmap
  • 原文地址:https://www.cnblogs.com/weijiqian/p/14831228.html
Copyright © 2020-2023  润新知