Почему ExecutorService не работает в потоке? - PullRequest
0 голосов
/ 28 июня 2018

Я передаю набор задач по потоку, вот упрощенная демонстрация:

    ExecutorService executorService = Executors.newCachedThreadPool((r) -> {
        Thread thread = new Thread();
        thread.setDaemon(true); // even I removed this, it's still not working;
        return thread;
    });
    IntStream.range(0, TASK_COUNT).forEach(i -> {
        executorService.submit(() -> {
            out.println(i);
            return null;
        });
    });

После того, как все задачи отправлены , я пытаюсь дождаться завершения всех из них, используя:

    executorService.shutdown();
    executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);

Но вывод - нет, ничего не распечатано.

Что-то не так? Любая помощь будет оценена.

Один странный вывод заключается в том, что при использовании значения по умолчанию DefaultThreadFactory это работает.

ExecutorService executorService = Executors.newCachedThreadPool();

F.Y.I Потоки демонов - это причина, которую я уже проверил. Для отладки я поставил их специально.

1 Ответ

0 голосов
/ 28 июня 2018

Вы забыли передать Runnable в конструктор Thread:

ExecutorService executorService = Executors.newCachedThreadPool(r -> {
    Thread thread = new Thread(r);
                               ^
    thread.setDaemon(false);
    return thread;
});
...