我有一个管理器类,允许子模块使用Runnable
注册一个shutdown-hook。
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()
中删除被称为,但我认为我可以控制需要运行的东西。
为了在清理过程中加快速度,我使用了((x1 * y2 - y1 * x2) + (x2 * y3 - y2 * x3) + (x3 * y4 - y3 * x4) + (x4 * y1 - y4 * x1)) / 2
。现在我想知道(在关机挂钩期间)这是不是一个坏主意:
任何经验丰富的人都可以提供建议吗?