为什么我的流程终止?

Mar*_*llo 6 java multithreading process

我有一个运行ping操作的Runnable对象 -

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();
                }
            }
        };
Run Code Online (Sandbox Code Playgroud)

如果我在这样的当前线程中启动它:

r1.run();
Run Code Online (Sandbox Code Playgroud)

我得到这个输出:

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
Run Code Online (Sandbox Code Playgroud)

但是如果我在这样的新线程中运行它:

    Thread thread = new Thread(r1);
    thread.start();
Run Code Online (Sandbox Code Playgroud)

我明白了:

Before process
Run Code Online (Sandbox Code Playgroud)

为什么输出不同?

par*_*lov 8

如果你在单独的线程中运行,你的主线程可能会在之前完成,所以你r1没有足够的时间来完成.如果你从当前线程开始,你将等到完成.尝试thread.join()在开始后添加,看看发生了什么.

  • 或者在开始之前添加`thread.setDaemon(false)`.这将防止新线程在主线程终止时停止. (3认同)