I need to execute an external batch file in java with a specific timeout. this means that if the batch takes longer than the specified timeout, I need to cancel the execution.
here is an example of the code i wrote:
public static void main(String[] args) throws IOException, InterruptedException { ProcessBuilder p = new ProcessBuilder("c:\\wait.bat", "25"); // batch file execution will take 25 seconds. final long l = System.currentTimeMillis(); System.out.println("starting..." + (System.currentTimeMillis() - l)); final Process command = p.start(); System.out.println("started..." + (System.currentTimeMillis() - l)); Timer t = new Timer(); t.schedule(new TimerTask() { @Override public void run() { command.destroy(); } }, 5000); // it will kill the process after 5 seconds (if it not finished yet). int i = command.waitFor(); t.cancel(); System.out.println("done..." + (System.currentTimeMillis() - l)); System.out.println("result : " + i); System.out.println("Really Done..." + (System.currentTimeMillis() - l)); }
The wait.bat batch file looks something like this:
@echo off echo starting the process... @ping 127.0.0.1 -n 2 -w 1000 > nul @ping 127.0.0.1 -n %1% -w 1000> nul echo process finished succesfully @echo on
As you can see in the code, the batch file will take 25 seconds (the first line in the main method), and the timer will destroy the command in 5 seconds.
here is the output of my code:
starting...0 started...0 done...5000 result : 1 Really Done...5000 BUILD SUCCESSFUL (total time: 25 seconds)
as you can see in the output, the last line ("Really Done ...") is executed at the 5th second, but the application terminates after 25 seconds.
my question is: although I called the destroy method in my timer, why is jvm still waiting for the process to complete?
java process
mhshams Feb 28 '11 at 6:39 2011-02-28 06:39
source share