【问题标题】:Why does the ExecutorService interface not implement AutoCloseable?为什么ExecutorService接口没有实现AutoCloseable?
【发布时间】:2017-05-14 14:07:15
【问题描述】:

未能在线程执行器上调用shutdown() 将导致应用程序永不终止。

关闭 ExecutorService 的最佳做法是:

ExecutorService service = null;
try {
  service = Executors.newSingleThreadExecutor();
  // add tasks to thread executor
  …
} finally {
  if (service != null) service.shutdown();
}

既然 Java 知道 try-with-resources 的概念,如果我们能做到这一点不是很好吗?

try (service = Executors.newSingleThreadExecutor())
{
  // add tasks to thread executor
  …
} 

【问题讨论】:

标签: java multithreading interface try-with-resources


【解决方案1】:

这是一个平庸的解决方法

ExecutorService service = Executors.newSingleThreadExecutor();
try (Closeable close = service::shutdown) {

}

或者,如果检查的异常困扰您,您可以这样写:

interface MyCloseable extends AutoCloseable {
    void close();
}

然后

ExecutorService service = Executors.newSingleThreadExecutor();
try (MyCloseable close = service::shutdown) {

}

当然,您绝对不能在赋值和try 语句之间放置任何内容,也不能在try 语句之后使用service 局部变量。

鉴于警告,请改用finally

【讨论】:

  • 嗨,这迫使我还要声明一个} catch (IOException e) { e.printStackTrace(); } - 我怎样才能避免这种情况?
  • @adrhc:用可能的解决方法更新了我的答案
【解决方案2】:

我看不出 AutoCloseable 对 Executor 有什么用处。 try-with-resources 用于可以在方法范围内初始化、使用和释放的事物。这适用于文件、网络连接、jdbc 资源等,它们可以快速打开、使用和清理。但是执行程序,尤其是线程池,是您希望在很长一段时间内可用的东西,可能在应用程序的整个生命周期内,并且往往会被注入到单例服务之类的东西中,它可以有一个 DI 框架知道的方法调用应用程序关闭以清理执行程序。这种使用模式无需 try-with-resources 即可正常工作。

此外,try-with-resources 背后的一大动力是确保异常不会被掩盖。这对于执行者来说不是一个考虑因素,所有的异常抛出都将发生在提交给执行者的任务中, 异常屏蔽不是问题。

【讨论】:

  • 一切都在一个方法的上下文中:程序的main方法。
【解决方案3】:

那个ExecutorService其实有两个关闭相关的方法;基于一个简单的事实,即两种关闭服务的方式都是有意义的。

因此:那么您将如何自动关闭服务?以一致的方式适用于所有人?!

所以,在我看来,合理的解释是:您不能将 ExecutorService 设为 AutoClosable,因为该服务没有单一的“关闭”类操作;但是两个!

如果你认为你可以很好地利用这种自动关闭服务,那么使用“委托”编写你自己的实现将是 5 分钟的事情!或者可能需要 10 分钟,因为您将创建一个调用 shutdown() 的版本作为关闭操作;还有一个是shutdownNow()

【讨论】:

  • 你可能是对的 ;) 我真正想说的是,完全可以将ExecutorService 的功能包装到支持AutoCloseable 的类中
  • 在 JDK 中不使 ExecutorService AutoClosable 的其他原因 - 这是一项服务,而不是资源... ExceturService 不扩展 Closeable 接口的原因完全相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-14
  • 2017-08-07
  • 2023-03-16
  • 2020-06-07
  • 1970-01-01
  • 2018-10-24
相关资源
最近更新 更多