2013-03-11 12 views
6

Mam Runnable obiektu, który uruchamia operację ping -Dlaczego mój proces się kończy?

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(); 
       } 
      } 
     }; 

Gdybym uruchomić ten w bieżącym wątku tak:

r1.run(); 

uzyskać ten wynik:

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 

Ale jeśli uruchomię go w nowym wątku:

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

uzyskać to:

Before process 

Dlaczego wyjść inaczej?

Odpowiedz

8

Jeśli uruchomisz osobny wątek, główny wątek prawdopodobnie skończy się wcześniej, więc Twój r1 nie będzie miał wystarczająco dużo czasu na dokończenie. Jeśli zaczniesz w bieżącym wątku, zaczekasz do końca. Spróbuj dodać thread.join() po uruchomieniu i zobacz, co się dzieje.

+0

Działa, dzięki! –

+3

Lub dodaj 'thread.setDaemon (false)' przed uruchomieniem. Zapobiegnie to zatrzymaniu się nowego wątku po zakończeniu wątku głównego. – buc

Powiązane problemy