Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why my Process terminate?

I have a Runnable object, that runs a ping operation -

Runnable r1 = new Runnable() {
            @Override
            public void run() {
                try{
                    List<String> commands = new ArrayList<String>();
                    commands.add("ping");
                    commands.add("-c");
                    commands.add("10");
                    commands.add("google.com");

                    System.out.println("Before process");
                    ProcessBuilder builder = new ProcessBuilder(commands);
                    Process process = builder.start();

                    BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
                    String line = null;
                    while ((line=reader.readLine()) != null){
                        System.out.println(line);
                    }
                    process.waitFor();
                    System.out.println("After process");

                }catch (Exception ex){
                   ex.printStackTrace();
                }
            }
        };

If I launch this in current thread like this:

r1.run();

I get this output:

Before process
PING google.com (173.194.32.33): 56 data bytes
64 bytes from 173.194.32.33: icmp_seq=0 ttl=53 time=34.857 ms
64 bytes from 173.194.32.33: icmp_seq=1 ttl=53 time=39.550 ms
64 bytes from 173.194.32.33: icmp_seq=2 ttl=53 time=44.212 ms
64 bytes from 173.194.32.33: icmp_seq=3 ttl=53 time=38.111 ms
64 bytes from 173.194.32.33: icmp_seq=4 ttl=53 time=39.622 ms
64 bytes from 173.194.32.33: icmp_seq=5 ttl=53 time=41.391 ms
64 bytes from 173.194.32.33: icmp_seq=6 ttl=53 time=41.280 ms
64 bytes from 173.194.32.33: icmp_seq=7 ttl=53 time=39.645 ms
64 bytes from 173.194.32.33: icmp_seq=8 ttl=53 time=35.931 ms
64 bytes from 173.194.32.33: icmp_seq=9 ttl=53 time=38.245 ms

--- google.com ping statistics ---
10 packets transmitted, 10 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 34.857/39.284/44.212/2.575 ms
After process

But if I run it in a new thread like this:

    Thread thread = new Thread(r1);
    thread.start();

I get this:

Before process

Why are the outputs different?

like image 946
Mary Ryllo Avatar asked Mar 11 '13 19:03

Mary Ryllo


1 Answers

If you run in separate thread, your main thread will probably finish before, so your r1 will not have enough time to finish. If you start in current thread you will wait until finish. Try to add thread.join() after start and see what is happening.

like image 119
partlov Avatar answered Oct 28 '22 10:10

partlov