2015-05-26 2 views
0

У меня есть эта простая схема:программ продолжают выполнение хотя все latch.countdown() называется

int parallelism = 4; //4 tasks 
ExecutorService executor = Executors.newCachedThreadPool(); 
CountDownLatch latch = new CountDownLatch(parallelism); 

for(int i=0;i<parallelism;i++){ 
    executor.execute(new MyTask()); 
} 

latch.await(); 
System.out.println("done"); 

Где Task просто вызывает

public void run(){ 
     System.out.println("working"); 
     latch.countDown(); 
} 

Даже если исполнение дает мне:

working 
working 
working 
working 
done 

общая программа продолжает выполнять! Как так?

+1

Работает так, как ожидалось. Основной поток ждет, пока все остальные потоки не назовут 'countDown()'. Чего ты ожидал? – TheLostMind

ответ

3

Вам необходимо закрыть Executor.

ExecutorService executor = Executors.newCachedThreadPool(); 
    // ... 
    executor.shutdown(); 
    while (executor.awaitTermination(1, TimeUnit.SECONDS)) { 
     System.out.println("This is taking too long."); 
    } 

Даже если все ваши runnables завершили Executor держит нити в бассейне. Это то, что удерживает ваш выход. Нить main не выйдет, пока все потоки не-демона не будут завершены.

Также см. Turning an ExecutorService to daemon in Java для другой альтернативы - использование потоков демона Executor.

Смежные вопросы