我有以下代码:
val executor = Executors.newScheduledThreadPool(4)
val futures = dataToProcess flatMap {
case (name, dataByDate) =>
dataByDate map {
case (date, data) =>
(name, date, data) -> executor.submit(new Callable[ProcessResult] {
override def call() = {
val result = processor.process(...)
persist(result, name, date, data)
result
}
})
}
}
在processor.process()
中,某些线程池( Executors.newFixedThreadPool(64))用于处理数据。 这些线程池不是动态创建的
在上面的代码中,我们得到了大约100K以下错误:
...
Exception in thread "Thread-129359954" java.lang.OutOfMemoryError: unable to create new native thread
Exception in thread "Thread-129359959" java.lang.OutOfMemoryError: unable to create new native thread
Exception in thread "Thread-129359963" java.lang.OutOfMemoryError: unable to create new native thread
Exception in thread "Thread-129359966" java.lang.OutOfMemoryError: unable to create new native thread
Exception in thread "Thread-129359970" java.lang.OutOfMemoryError: unable to create new native thread
Exception in thread "Thread-129359978" java.lang.OutOfMemoryError: unable to create new native thread
...
。
我不知道为什么要创建这么多线程。欢迎任何意见。谢谢。
更新
我发现在contextInitialized()
的Java Web应用程序代码库中,在许多实例中创建并重用了一些线程池(Executors.newCachedThreadPool()
和Executors.newScheduledThreadPool(1)
)。 但是shutdown()
中没有明确调用contextDestroyed()
。如果未显式关闭这些线程池,将会发生什么。我想知道这是否是产生这么多线程的原因。
答案 0 :(得分:0)
执行完成后,线程将立即返回到池中。即使您关机,我也假设您仍在并行创建过多的执行器服务。然后关机将等待所有任务完成。这样您就可以进行资源争用了。