Java:关机挂钩中的线程

时间:2018-05-24 03:20:07

标签: java multithreading shutdown shutdown-hook

我有一个管理器类,允许子模块使用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。现在我想知道(在关机挂钩期间)这是不是一个坏主意:

  1. 使用线程池;
  2. 或者,创建更多主题。
  3. 任何经验丰富的人都可以提供建议吗?

0 个答案:

没有答案