【发布时间】:2018-04-10 17:10:30
【问题描述】:
我正在使用 Spring,在 RequestMap 方法中我有如下代码:
@RequestMap
public void someMethod() {
ThreadPoolExecutor executor = Executors.newFixedThreadPool(N);
executor.submit(new Runnable());
executor.submit(new Runnable());
}
然后,即使每个 Runnable 应该在几秒钟内完成,我也会不断收到 OOM 错误。在分析堆转储后,我发现有数千个Thread 对象。
然后我把executor改成singlton 和Executors.newCachedThreadPool,这个问题就解决了。
据我了解,方法返回后,并没有对线程池的引用,所以应该是垃圾回收,但事实是线程还在堆上。为什么?
【问题讨论】:
-
如果您想并行运行,请考虑使用 rxjava 之类的东西,这样您就不必自己处理线程/池。
-
您可能需要为此查看 spring async。
标签: java spring multithreading