Я пытаюсь понять countDownLatch, и у меня есть эта программа, но я не знаю, почему моя программа не возвращается и не заканчивается.
package countDownLatches;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
class Processor implements Runnable {
CountDownLatch latch;
public Processor(CountDownLatch latch) {
this.latch = latch;
}
public void run() {
System.out.println("thread started: ");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
latch.countDown();
}
}
public class App {
public static void main(String args[]) {
CountDownLatch latch = new CountDownLatch(3);
ExecutorService executorService = Executors.newFixedThreadPool(3);
for (int i = 0; i < 3; i++) {
executorService.submit(new Processor(latch));
}
try {
latch.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("task completed");
}
}
Вам необходимо закрыть службу исполнителя должным образом. Или он будет ждать новых задач на неопределенный срок.
Добавить:
executorService.shutdown();
До:
System.out.println("task completed");
Я думаю, что основная причина, почему это было сделано в java api, заключается в том, что executorService может получать задания из нескольких потоков (кроме основного), поэтому - почему он должен останавливаться, когда больше нет действий в основном потоке? Да, я считаю, это не должно.
Вам нужно закрыть службу исполнителя. Добавьте эту строку после цикла for
:
executorService.shutdown();
Альтернативный метод, который ожидает, что все активно выполняемые задачи завершатся, - это
executorService.awaitTermination();
Вы можете прочитать больше в " Исполнительной службе Javadoc".