Java CachedThreadPool中的线程太多?
我有以下代码:Java CachedThreadPool中的线程太多?,java,multithreading,scala,threadpool,threadpoolexecutor,Java,Multithreading,Scala,Threadpool,Threadpoolexecutor,我有以下代码: val executor = Executors.newScheduledThreadPool(4) val futures = dataToProcess flatMap { case (name, dataByDate) => dataByDate map { case (date, data) => (name, date, data) -> executor.sub
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个以下错误:
...
线程“thread-129359954”java.lang.OutOfMemoryError中出现异常:无法创建新的本机线程
线程“thread-129359959”java.lang.OutOfMemoryError中出现异常:无法创建新的本机线程
线程“thread-129359963”java.lang.OutOfMemoryError中出现异常:无法创建新的本机线程
线程“thread-129359966”java.lang.OutOfMemoryError中出现异常:无法创建新的本机线程
线程“thread-129359970”java.lang.OutOfMemoryError中出现异常:无法创建新的本机线程
线程“thread-129359978”java.lang.OutOfMemoryError中出现异常:无法创建新的本机线程
…
我不知道为什么创建了这么多线程。欢迎任何评论。谢谢
更新
我发现在Java web应用程序的代码库中,在
contextInitialized()
中,一些线程池(Executors.newCachedThreadPool()
和Executors.newScheduledThreadPool(1)
)被创建并在许多实例中重用但是shutdown()
没有在contextdestromed()
中显式调用。如果这些线程池没有显式关闭,将会发生什么。我不知道这是否是这么多线程的原因 执行完成后,线程将返回到池中。即使您关闭了,我假设您仍然并行创建了太多的executor服务。关闭将等待所有任务完成。因此,您将面临资源争用。不要动态创建线程池和执行器。让你的处理器使用你在顶层创建的同一个执行器。这个数字129362014可能不是序列号。不要认为这意味着你的程序已经创建了超过一亿个线程。最有可能的数字来自线程对象的虚拟内存地址。