java的runtime.exec创建的线程被挂起的解决办法。

转载 2007年10月13日 21:16:00
 

java class process方法exec调用方法proccess proc.exec(command)。当command的输出内容过大时(OS的I/O buffer容纳不下输出流时),程序会被挂起。解决此内问题的方法将command的输出流proc.getErrorStream(),proc.getInputStream()清空。以下为一示例, linux7.2,jdk1.5.0_06下编译通过。

/*************************************************************************************
*Process exec method: clearn output stream first
*by Benny Zhou
*2/27/2007
**************************************************************************************/
/*
*Runtime.exec method. A few things to keep in mind when using this:
*1. Always read from the streams prior to calling waitFor.
*Otherwise you could end up waiting forever on Windows and other OS platforms whose I/O buffers can¡¯t store enough from
*standard out and standard error to ensure the program has finished. These platforms will pause the execution of whatever
*is running until something reads the buffered content from standard  out and standard error. All platforms suffer from
*this, but some platforms have larger buffers than  others. Needless to say, always read from the streams first.
*2. Always read from standard error first.
*If you read from standard out first and the process only writes to standard error, you¡¯ll hang forever waiting to read.
*IF you read from standard error first, you¡¯ll always be okay on these platforms because the OS seems to shutdown standard
*error.
*/
import java.io.*;
import java.lang.*;  
import java.util.*;

public class ProcessExec
{

        static void drainInBackground(final InputStream is) {
                 new Thread(new Runnable(){
                public void run(){
                        try{
                             while( is.read() >= 0 );
                        } catch(IOException e){
                        }
                }
                }).start();
        }

        public void UnpackupDir(String rootpath,String tarname,String backupType) throws IOException
        {
                String unpackdir=rootpath;
                String strUnpackName = "";
                Runtime r=Runtime.getRuntime();
                Process prog=null;

                strUnpackName="./restoreoptarfile.sh "+unpackdir +" "+tarname+" "+backupType;
                try
                {       System.out.println("========before process.exec()");
                        prog=r.exec(strUnpackName);
                        System.out.println("========after process.exec()");
                        System.out.println("========before process.waitFor()");


                        //==========method 2, clearn output stream first
                        drainInBackground(prog.getErrorStream());
                        drainInBackground(prog.getInputStream());


                        /*//==========method 1. get streams and standart out put first, still need clearn output stream
                        BufferedReader stderr = new BufferedReader(new InputStreamReader(prog.getErrorStream()));
                        String LineErr = stderr.readLine();

                        BufferedReader inpbuildtar = new BufferedReader(new InputStreamReader(prog.getInputStream()));
                        String LINE = inpbuildtar.readLine();
                         while (LineErr !=null)
                        {
                                System.out.println("LineError>>>"+LineErr);
                                LineErr = stderr.readLine();
                        }

                        while (LINE != null)
                        {
                                System.out.println("Line>>>"+LINE);
                                LINE = inpbuildtar.readLine();

                        }
                        */

                        int progEnd = prog.waitFor();
                //      inpbuildtar.close();
                //      stderr.close();

                        System.out.println("========after process.waitFor()");
                        System.out.println("========before Runtime.gc()");
                        r.gc();
                        String unpackfiledir = unpackdir +File.separator+tarname;
                        File unpackfile= new File(unpackfiledir);
                        File dirUnpack = new File(unpackdir +File.separator+backupType+File.separator+"structure"+File.separator+"wbxsite.stc");
                        if(!unpackfile.exists() || !dirUnpack.exists())
                        {
                                System.out.println("ERROR>> Tar file do not unpack  please check the parameter !");
                                System.out.println("ERROR>> Please make sure you have executed the command: <chmod +x *.sh>");
                                System.exit(0);
                        }
                        else
                        {}
                }
                catch(Exception e)
                {
                        System.out.println("ERROR>> Tar file is not unpacked successfully!");
                        System.exit(0);
                }
        }

        public static void main(String args[])
        {
                ProcessExec proexec = new ProcessExec();               
                String str_rootpath="/webex_doc/dfs/migrate/backup";
                String str_tarname="everest@wconfig%T25L%2%2@400006466.tar";
                String str_backupType="everest";
                           
                try
                {
                        proexec.UnpackupDir(str_rootpath,str_tarname,str_backupType);
                }
                catch (Exception e)
                {
                        String err = e.getMessage();
                        System.out.println(err);
                        System.exit(0);
                }
        }

java.lang.Runtime.getRuntime().exec 调用后,等待被调用程序结束后再继续执行

在java中调用操作系统的程序时,可以使用java.lang.Runtime.getRuntime().exec() 来实现,但是这个方法在调用命令后就直接返回当前线程了;程序设计时,有时候需要在等待...
  • binyao02123202
  • binyao02123202
  • 2011年11月25日 13:30
  • 7378

Java线程的挂起与恢复 wait(), notify()方法介绍

一, 什么是线程的挂起与恢复 从字面理解也很简单. 所谓线程挂起就是指暂停线程的执行(阻塞状态). 而恢复时就是让暂停的线程得以继续执行.(返回就绪状态) 二, 为何需要挂起和恢复线程. 我们...
  • nvd11
  • nvd11
  • 2014年03月10日 15:55
  • 1178

多线程Runtime.getRuntime().exec常见问题

Java调用一个bat批处理程序,调用几十次后会莫名的不再执行,无任何异常抛出。千试万试,LOG精细到逐行,只知道走到Runtime.getRuntime().exec()程序就停止了,但打死不知道为...
  • seapeak007
  • seapeak007
  • 2017年04月08日 13:23
  • 593

※※Java调用Runtime.exec()要注意的问题

※※Java调用Runtime.exec()要注意的问题 标签:execJavaRuntime 字体:【默认中大】 http://it.superkoo.com/#/topic/479/ ...
  • keti_xuetangyi
  • keti_xuetangyi
  • 2013年04月08日 13:03
  • 785

java Runtime 执行exec 不能进行管道解决方案

ps -ax|grep "avd 5554"|awk '{print $1}'
  • mldxs
  • mldxs
  • 2014年06月12日 23:50
  • 4827

JAVA中Runtime类以及exec()方法,Process的使用

package ioTest.io1; /* * Runtime:每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接。 * 这也是jvm实现跨平台的一...
  • HYM1987
  • HYM1987
  • 2014年05月01日 19:44
  • 4324

java runtime.exec常见问题

Java中Runtime.exec的一些事 博客分类:  Java基础库   0 预备知识 1 不正确的调用exitValue 2不正确的调用waitFor 3 一种可接受的...
  • mengxingyuanlove
  • mengxingyuanlove
  • 2016年02月21日 12:09
  • 2885

多线程Runtime.getRuntime().exec常见问题

JAVA调用一个bat批处理程序,调用几十次后会莫名的不再执行,无任何异常抛出。千试万试,LOG精细到逐行,只知道走到Runtime.getRuntime().exec()程序就停止了,但打死不知道为...
  • chengly0129
  • chengly0129
  • 2015年11月16日 14:15
  • 2039

工作中遇到的关于java runtime.exec()的问题

摘抄的别人的,但是自己在工作中也遇到了这个问题,希望自己以后多看看:连接  点击打开链接 那就首先说点Runtime类吧,他是一个与JVM运行时环境有关的类,这个类是Singleton的。我说...
  • cckk123456789
  • cckk123456789
  • 2014年03月07日 15:50
  • 916

【Java并发编程】之三:线程挂起、恢复与终止的正确方法(含代码)

转载请注明出处:     Thread 的API中包含两个被淘汰的方法,它们用于临时挂起和重启某个线程,这些方法已经被淘汰,因为它们是不安全的,不稳定的。如果在不合适的时候挂起线程(比如,锁定共享...
  • mmc_maodun
  • mmc_maodun
  • 2013年12月04日 08:12
  • 19415
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java的runtime.exec创建的线程被挂起的解决办法。
举报原因:
原因补充:

(最多只允许输入30个字)