为什么执行器服务接口不实现自动关闭?

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

关闭执行器服务的最佳实践是:

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

既然Java知道试用资源的概念,如果我们能做到这一点,那不是很好吗?

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

答案 1

该执行器服务实际上有个与关闭相关的方法;基于一个简单的事实,即关闭服务的两种方法都是有意义的。

因此:那么您将如何自动关闭服务?以一致的方式为每个人工作?!

因此,在我看来,合理的解释是:您不能使执行器服务成为自动关闭的,因为该服务没有单个“关闭”之类的操作;但是两个!

如果您认为可以充分利用这样的自动关闭服务,那么使用“委派”编写自己的实现将是一件5分钟的事情!或者可能是10分钟,因为您将创建一个版本调用作为关闭操作;取而代之的是。shutdown()shutdownNow()


答案 2

这是一个平庸的解决方法

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

}

或者,如果选中的异常困扰您,您可以编写:

interface MyCloseable extends AutoCloseable {
    void close();
}

然后

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

}

当然,永远不要在赋值和语句之间放置任何东西,也不能在语句之后使用局部变量。tryservicetry

鉴于警告,请改用。finally