【问题标题】:What are the best practices to manage an ExecutorService in a library?在图书馆管理 ExecutorService 的最佳实践是什么?
【发布时间】:2013-06-12 02:48:04
【问题描述】:

在我的一个库中,我使用具有 5 个线程的固定线程池执行器;我的线程不是重量级的,我.get() 有超时,但至于ExecutorService,我创建它,然后,这是“生死攸关”。

完成后你应该.shutdown{,Now}()它;但这是一个库,我无法提前知道如何使用它:使用简单的main(),在将由 servlet 容器等管理的 web 应用程序中。

这感觉不对。我怎样才能做得更好?我应该只使用ExecutorService以外的其他东西吗?

EDIT 链接到唯一用户:here;守护线程可能是一个解决方案,现在我不知道它们是否有我应该注意的缺点......

【问题讨论】:

  • IMO,它在客户端(您的 API 调用者)上关闭服务,因为您的库是 有状态的。当然,守护线程可以解决一些问题,但这可能不是您想要的,因为在所有非守护线程都停止后它们会自动死亡。是否可以将接口共享到您的库?
  • @home 链接到唯一使用它的类:here。 “用户端”类,MessageBundle,可以是private static final——其实我一直都是这样用的

标签: java threadpool shutdown-hook


【解决方案1】:

好吧,这不是一个真正的答案,更像是一个想法......

正如我在之前的评论中已经提到的,您的 LoadingMessageSourceProvider 组件保持状态,因此必须有人负责正确关闭该组件。您可以尝试通过注册shutdown hook 将其作为组件的一部分来实现(我不会在这里考虑finalize :-)。

我宁愿把它留给组件的用户(应用程序),因为它更好地知道何时关闭。事实上,您正在实现一个具有生命周期的轻量级容器 - 在某种程度上类似于实现 JSR-236 的 Java EE 7 容器提供程序。

鉴于您没有可用的 JSR-236 容器,您必须允许调用者管理生命周期。我可以想到一种工厂方法,简化示例:

// maintains the executor service (one service per factory)
private MessageSourceProviderFactory f = MessageSourceProviderFactory.instance();

private void stuff() {
    MessageSourceProvider msp = f.newBuilder()/*. [...] */.build();
    // work with the provider
}

// at some point in time the caller decides to finish
private void end() {
    f.shutdown(); // shutdown the factory and the ExecutorService
}

JSR-236 第 3.1.6.1 节在生命周期方面相当有趣:

3.1.6.1 Java EE 产品提供者要求 本小节描述了 ManagedExecutorService 的附加要求 供应商。

  1. 所有任务,当从 ManagedExecutorService 执行时,将使用提交的组件的 Java EE 组件标识运行 任务。
  2. ManagedExecutorService 的生命周期由应用服务器管理。上的所有生命周期操作 ManagedExecutorService 接口会抛出一个 java.lang.IllegalStateException 异常。这包括 以下方法中定义的 java.util.concurrent.ExecutorService 接口:awaitTermination(), isShutdown()、isTerminated()、shutdown() 和 shutdownNow().Final 发布 3-11
  3. 如果任务的组件未启动,则任何提交给执行程序的任务都无法运行。

当 ManagedExecutorService 实例被关闭时 Java EE 产品提供商:

  1. 所有提交新任务的尝试都被拒绝。
  2. 如果未运行,所有提交的任务将被取消。
  3. 所有正在运行的任务线程都被中断。
  4. 所有注册的 ManagedTaskListener 都被调用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 2021-08-11
    相关资源
    最近更新 更多