【问题标题】:submit of ExecutorService confusion in Java在 Java 中提交 ExecutorService 混淆
【发布时间】:2016-07-20 17:20:27
【问题描述】:

这里是我指的方法,想知道如果我调用submit,不使用Future的get方法获取结果,会不会有线程泄漏(我的意思是线程池中的一个线程永远无法重用再次因为它的结果没有被检索到),这会影响未来整个线程池的性能吗?谢谢。

https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html#submit-java.util.concurrent.Callable-

问候, 林

【问题讨论】:

  • 我的意思是线程池中的一个线程永远无法再次被重用,因为它的结果没有被检索到你能描述一下你在这里想到的行为吗?
  • 这是您可以轻松测试的东西:创建一个固定的线程池,提交比线程数更多的请求,然后看看会发生什么。
  • 您不提交线程,您提交RunnableCallable 实例。结果不存储在线程中,它们存储在对象中。为什么你期望一个对象阻止线程运行?
  • 我是“学习测试”的忠实粉丝。如果我正在编写依赖于第三方库的代码,并且我不确定该库在某些情况下的行为方式,我会为它编写一个单元测试,就好像它是我自己的代码一样。我将单元测试保留作为项目的永久部分,因为它记录了我对库所做的假设,并且如果我切换到更新版本的库时它会提醒我不再符合我之前的预期。
  • 很难想到和记录图书馆不做的所有事情。它没有设计师可能从未想过的问题。

标签: java multithreading executorservice


【解决方案1】:

您需要知道的一件事是ExecutorService 是一个接口,而不是一个类,因此对于ExecutorService 的不同实现,答案可能不同。

话虽如此,如果ExecutorService 以您担心的方式运行,那么对于大多数应用程序来说都是没有意义的。如果每个工作线程将其结果存储在返回给客户端的Future 对象中,然后忘记结果,忘记Future,然后继续下一个任务,那将更有意义。

IF 这就是它的实现方式,if 你的代码也忘记了Future,然后Future 和结果都将被收集GC,就这样结束了。

这对我来说是有意义的实现。您可以通过查看源代码来亲自了解 OpenJDK 项目中的 ThreadPoolExecutor 类实际上是如何做到的:

http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/util/concurrent

我快速浏览了一下,但我没有时间深入研究它。

正如我在评论(上文)中所说,我会编写一个测试,如果我有任何疑问,我会自己找出答案。

【讨论】:

  • 感谢詹姆斯,为回复投票。想知道是否会影响内存的性能?即如果我不检索结果,内存会越来越大,可能会触发GC,对吗?
  • @LinMa,忽略您的任务已返回的结果不会增加内存使用量。内存是在您的任务创建对象时分配的,并且在对象变得“无法访问”后很快就会被 GC 回收。 (即,当程序中没有引用它的变量时。)
  • 谢谢詹姆斯,投票并将您的回复标记为答案。感谢您耐心向我解释。
猜你喜欢
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-16
  • 2016-05-27
相关资源
最近更新 更多