简体   繁体   中英

java System.out missing out

The output of the following simple code is a little odd to me. it miss out some of the numbers between 0 and 100 to print on the console.

could anyone explain why it omit to print? i am completely new to concurrency programming.

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import org.junit.Test;


public class SimpleTest {

    @Test
    public void testSimple() throws Exception {
        ExecutorService executorService = Executors.newFixedThreadPool(10);

        for(int i = 0; i <= 100; i++) {
            executorService.execute(new SimpleRunnable(i));
        }

        executorService.shutdown();
    }

}

class SimpleRunnable implements Runnable {

    int i;

    public SimpleRunnable(int i) {
        this.i = i;
    }

    public void run() {
        synchronized(System.out) {
            System.out.println(i);
        }
    }

}

You should wait for the executor service to finish after calling shutdown

executorService.shutdown();
executor.awaitTermination(30, TimeUnit.SECONDS); // Wait for the tasks to finish.
// and flush!
System.out.flush();

I suspect the threads created are daemon threads, which do not prevent a JVM shutdown. Since the threads are kicked off and forgotten, after your call to shutdown , the method returns and then the JVM exits because there is nothing else to do. Unfinished work never gets done.

As Elliot pointed out, use the awaitTermination method:

http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html#awaitTermination(long , java.util.concurrent.TimeUnit)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM