3

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

.shutdown{,Now}()当你完成它时,你应该这样做;但这是一个库,我无法提前知道它将如何使用:使用简单的main(), 在将由 servlet 容器管理的 webapp 中,其他。

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

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

4

1 回答 1

0

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

正如我在之前的评论中已经提到的,您的LoadingMessageSourceProvider组件保持状态,因此必须有人负责正确关闭组件。您可以尝试通过注册一个关闭挂钩来将其作为组件的一部分来实现(我不会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()。最终版本 3-11
  3. 如果任务的组件未启动,则任何提交给执行器的任务都不能运行。

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

  1. 所有提交新任务的尝试都被拒绝。
  2. 如果未运行,所有提交的任务将被取消。
  3. 所有正在运行的任务线程都被中断。
  4. 调用所有注册的 ManagedTaskListener
于 2013-06-16T07:56:24.473 回答