我在过去几个小时里阅读了很多关于这个问题的内容,但我仍然无法找到任何一个(有效的)理由来调用shutdown()
方法关闭ExecutorService
,除非我们有一个存储着许多不常使用的执行器服务的庞大应用程序。
从我所了解的情况来看,shutdown()
方法只会做与普通线程完成后一样的事情。当普通线程完成Runnable(或Callable)的run方法后,它将被传递给垃圾回收进行回收。对于执行器服务,线程将只是被暂时挂起,而不会被标记为可回收的垃圾。因此需要使用shutdown()
方法。
好了,回到我的问题上来。有没有任何理由经常调用ExecutorService
的shutdown()
方法,甚至是在提交任务后立即调用?我想排除某些情况下调用awaitTermination()
的情况,因为这是验证过的。一旦我们这样做了,就必须重新创建一个新的ExecutorService
,以实现同样的功能。难道ExecutorService
的整个理念不是要重复使用线程吗?那么为什么要这么快销毁它呢?
难道不是一个合理的方法就是简单地创建ExecutorService
(或根据需要创建多个),然后在应用程序运行时传递任务,最后在应用程序退出或其他重要阶段关闭这些执行器吗?
我希望得到一些经验丰富的编码人员对此问题的答案,他们经常使用ExecutorService
编写异步代码。
第二个较小的问题涉及到安卓平台。如果你们中的一些人说每次都关闭执行器并不是最好的想法,那么在安卓上处理这些关闭(具体来说是在应用程序生命周期的不同事件中执行它们)会怎样呢?
由于CommonsWare的评论,我使这篇文章保持中立。我真的不想为此争论到底,似乎它正在朝着那个方向发展。我只对从有经验的开发人员那里学习我在这里问的东西感兴趣,如果他们愿意分享他们的经验的话。谢谢。
Executors.newSingleThreadScheduledExecutor()
返回的执行器服务上调用shutdown()
之前不会终止。 - Joe Lapp