CachedThreadPool有太多线程?

时间:2018-09-10 14:51:39

标签: 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.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() 。如果未显式关闭这些线程池,将会发生什么。我想知道这是否是产生这么多线程的原因。

1 个答案:

答案 0 :(得分:0)

执行完成后,线程将立即返回到池中。即使您关机,我也假设您仍在并行创建过多的执行器服务。然后关机将等待所有任务完成。这样您就可以进行资源争用了。