在 Java 中提交 ExecutorService 混淆
submit of ExecutorService confusion in Java
这里是我指的方法,想知道如果我调用提交,不使用Future的get方法获取结果,会不会有线程泄漏(我的意思是线程池中的线程永远无法由于没有检索到它的结果而再次被重用),这将影响未来整个线程池的性能?谢谢
此致,
林
你需要知道的一件事是 ExecutorService
是一个接口,而不是 class,所以答案 可能 对于不同的实现不同ExecutorService
.
也就是说,如果 ExecutorService
以您担心的方式运行,那么对于大多数应用程序来说就没有意义了。如果每个工作线程将其结果存储在返回给客户端的 Future
对象中,然后忘记结果,忘记 Future
,然后继续下一个任务。
IF 这就是它的实现方式,如果 你的代码也忘记了 Future
,那么 Future
并且结果都将由 GC 收集,到此结束。
这是对我来说有意义的实现。你可以自己看看OpenJDK项目中的ThreadPoolExecutor
class到底是怎么做的,查看源码:
http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/util/concurrent
匆匆浏览了一下,没时间深入研究
正如我在评论(上面)中所说,我会写一个测试,如果有任何疑问,我会自己找出来。
这里是我指的方法,想知道如果我调用提交,不使用Future的get方法获取结果,会不会有线程泄漏(我的意思是线程池中的线程永远无法由于没有检索到它的结果而再次被重用),这将影响未来整个线程池的性能?谢谢
此致, 林
你需要知道的一件事是 ExecutorService
是一个接口,而不是 class,所以答案 可能 对于不同的实现不同ExecutorService
.
也就是说,如果 ExecutorService
以您担心的方式运行,那么对于大多数应用程序来说就没有意义了。如果每个工作线程将其结果存储在返回给客户端的 Future
对象中,然后忘记结果,忘记 Future
,然后继续下一个任务。
IF 这就是它的实现方式,如果 你的代码也忘记了 Future
,那么 Future
并且结果都将由 GC 收集,到此结束。
这是对我来说有意义的实现。你可以自己看看OpenJDK项目中的ThreadPoolExecutor
class到底是怎么做的,查看源码:
http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/util/concurrent
匆匆浏览了一下,没时间深入研究
正如我在评论(上面)中所说,我会写一个测试,如果有任何疑问,我会自己找出来。