Java: Потоки в Завершение работы - PullRequest
0 голосов
/ 24 мая 2018

У меня есть класс менеджера, который позволяет субмодулям регистрировать ловушку отключения, используя Runnable.

public class ApplicationManager() {
    private final List<Runnable> shutdownHooks;

    private ApplicationManager() {
        // Other stuff

        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            if (shutdownHooks != null && !shutdownHooks.isEmpty()) {
                shutdownHooks.parallelStream()
                             .forEach(Runnable::run);
            }
        }));
    }

    // Other singleton stuff

    public void registerShutdownHook(final Runnable hook) {
        if (hook != null) {
            this.shutdownHooks.add(hook);
        }
    }

    public void resetApplication() {
        // Reset stuff

        shutdownHooks.parallelStream()
                     .forEach(Runnable::run);
        shutdownHooks.clear();
    }
}

Причина, по которой этот класс не принимает Thread экземпляров в registerShutdownHook(), былаглавным образом, чтобы уменьшить сложность для вызывающего абонента (чтобы не нужно было переносить его в экземпляре Thread).

Приложение может быть сброшено, и я хочу очистить приложение, выполнив все завершение работыкрючки.Хотя я мог обернуть каждый Runnable Thread, зарегистрировать все из них Runtime во время registerShutdownHook() и удалить их из Runtime при вызове resetApplication(), но я подумал, что это может быть лучшеЯ контролирую то, что должно быть запущено.

Чтобы ускорить процесс во время очистки, я использовал parallelStream().Теперь я задаюсь вопросом, является ли это плохой идеей (во время завершения подключения):

  1. Использовать пул потоков;
  2. В качестве альтернативы, создать больше потоков.

Кто-нибудь достаточно опытен, чтобы дать совет?

...