在我的一个库中,我使用一个带有5个线程的固定线程池执行器;我的帖子不是重量级的,我.get()
有超时,但至于ExecutorService
,我创建它,之后,这就是“活着,让我们死”。
当你完成它时,你应该.shutdown{,Now}()
;但这是一个库,我事先无法知道如何使用它:使用简单的main()
,在一个将由servlet容器管理的webapp中,其他人。
这感觉不对。我该怎么做得更好?我应该使用除ExecutorService
以外的其他东西吗?
编辑链接到唯一的用户:here;守护程序线程可能是一个解决方案,现在我不知道它们是否有我应该注意的缺点......
答案 0 :(得分:0)
好的,这不是一个真正的答案,更像是一个想法......
正如我在之前的评论中已经提到的,您的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的其他要求 供应商。
- 从ManagedExecutorService执行时,所有任务都将使用提交的组件的Java EE组件标识运行 任务。
- ManagedExecutorService的生命周期由应用程序服务器管理。所有生命周期操作都在 ManagedExecutorService接口会抛出一个 java.lang.IllegalStateException异常。这包括 以下方法中定义的方法 java.util.concurrent.ExecutorService接口:awaitTermination(), isShutdown(),isTerminated(),shutdown()和shutdownNow()。Final 发布3-11
- 如果未启动任务组件,则无法提交执行程序的任务。
醇>当ManagedExecutorService实例被关闭时 Java EE产品提供商:
- 拒绝所有提交新任务的尝试。
- 如果未运行,则会取消所有提交的任务。
- 所有正在运行的任务线程都被中断。
- 调用所有已注册的ManagedTaskListeners
醇>