Почему мои темы не заканчиваются

1

Я пытаюсь понять 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");
    }
}
Теги:
multithreading

2 ответа

1
Лучший ответ

Вам необходимо закрыть службу исполнителя должным образом. Или он будет ждать новых задач на неопределенный срок.

Добавить:

executorService.shutdown();

До:

System.out.println("task completed");

Я думаю, что основная причина, почему это было сделано в java api, заключается в том, что executorService может получать задания из нескольких потоков (кроме основного), поэтому - почему он должен останавливаться, когда больше нет действий в основном потоке? Да, я считаю, это не должно.

3

Вам нужно закрыть службу исполнителя. Добавьте эту строку после цикла for:

executorService.shutdown();

Альтернативный метод, который ожидает, что все активно выполняемые задачи завершатся, - это

executorService.awaitTermination();

Вы можете прочитать больше в " Исполнительной службе Javadoc".

Ещё вопросы

Сообщество Overcoder
Наверх
Меню