在库中管理ExecutorService的最佳实践是什么?

时间:2013-06-15 16:27:35

标签: java threadpool shutdown-hook

在我的一个库中,我使用一个带有5个线程的固定线程池执行器;我的帖子不是重量级的,我.get()有超时,但至于ExecutorService,我创建它,之后,这就是“活着,让我们死”。

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

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

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

1 个答案:

答案 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的其他要求   供应商。

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

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

         
        
    1. 拒绝所有提交新任务的尝试。
    2.   
    3. 如果未运行,则会取消所有提交的任务。
    4.   
    5. 所有正在运行的任务线程都被中断。
    6.   
    7. 调用所有已注册的ManagedTaskListeners
    8.   
相关问题