Mar 24

You need to read any output from standard output or standard error when running a process using Runtime.exec(). If you don’t the buffers may fill up causing the process to lock up.

The following code can be used to handle reading the process output, and the linked article provides a lot of great insight into the correct usage of Runtime.exec().

/** code copied from
 *  http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html
 *  When Runtime.exec() won't: Navigate yourself around pitfalls
 *  related to the Runtime.exec() method
 *  @author Michael Daconta
 */
import java.util.*;
import java.io.*;

class StreamGobbler extends Thread
{
    InputStream is;
    String type;
    OutputStream os;
    
    StreamGobbler(InputStream is, String type)
    {
        this(is, type, null);
    }

    StreamGobbler(InputStream is, String type, OutputStream redirect)
    {
        this.is = is;
        this.type = type;
        this.os = redirect;
    }
    
    /** creates readers to handle the text created by the external program
    */		
    public void run()
    {
        try
        {
            PrintWriter pw = null;
            if (os != null)
                pw = new PrintWriter(os);
                
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String line=null;
            while ( (line = br.readLine()) != null)
            {
                if (pw != null)
                    pw.println(line);
                System.out.println(type + ">" + line);    
            }
            if (pw != null)
                pw.flush();
        } catch (IOException ioe)
            {
            ioe.printStackTrace();  
            }
    }
}

written by objects \\ tags: , , , , , , ,


3 Responses to “Runtime.exec locks up and process never completes”

  1. Juhani Says:

    Yes. This is a very good article. Developer may ignore the fact it is a process hence just fetch the output or buffer is over filled (locked). This article is excellent to my project.

  2. Tan Elvin Says:

    how am i gg to use this. i have written a program to import a file using java, the file (or sql) is imported to mysql. however, there is no way i can figure out the time needed for the sql to finish up before i can continue to the nxt step. can this article above helps?

  3. objects Says:

    This article will only help if you are using Runtime.exec() which by the sound of it you aren’t.

Leave a Reply

You must be logged in to post a comment.