У меня есть класс менеджера, который позволяет субмодулям регистрировать ловушку отключения, используя 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()
.Теперь я задаюсь вопросом, является ли это плохой идеей (во время завершения подключения):
- Использовать пул потоков;
- В качестве альтернативы, создать больше потоков.
Кто-нибудь достаточно опытен, чтобы дать совет?