Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java CachedThreadPool中的线程太多?_Java_Multithreading_Scala_Threadpool_Threadpoolexecutor - Fatal编程技术网

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可能不是序列号。不要认为这意味着你的程序已经创建了超过一亿个线程。最有可能的数字来自线程对象的虚拟内存地址。