当任务在 Java 内完成时,线程正在增加但没有减少

Threads are increasing but not decreasing when the task finished in Java

我有一个应用程序,我按如下方式配置了线程,

corepoolsize = 10
maxpoolsize = 10
queuecapacity = 10

但是当我在线程(异步进程)上使用 运行 的线程和函数时 我看到它像下面这样增加,但我没有看到线程在减少。这是内存泄漏的迹象吗?有人可以指导我吗?

日志打印成这样,

2021-09-15 01:13:48.554  INFO 111 --- [Async-1]
2021-09-15 01:13:48.654  INFO 121 --- [Async-2]
2021-09-15 01:13:48.754  INFO 132 --- [Async-3]
2021-09-15 01:13:48.854  INFO 140 --- [Async-4]
2021-09-15 01:13:48.954  INFO 155 --- [Async-5]
2021-09-15 01:13:49.554  INFO 160 --- [Async-6]

但我没看到它再次调用 [Async-1], [Async-2] 那样。这是内存泄漏还是线程缓存,或者在填满 corepoolsize 之后会 运行 [Async-1]?

这是预期的行为。 ThreadPoolExecutor 的文档明确指出:

When a new task is submitted in method execute(Runnable), if fewer than corePoolSize threads are running, a new thread is created to handle the request, even if other worker threads are idle.

Corepoolsize表示一直存活的工作线程

可以查看ThreadPoolExecutor#runWorkerThreadPoolExecutor#getTask方法,这些工作线程会一直尝试从任务队列中获取任务并执行。所以如果没有新的任务发布到线程池,那么这些工作线程会一直存活,通常会阻塞在workQueuetake方法中,所以不用担心[=29] =]空转。

corepoolsize个数以外的worker线程会被回收,仍然ThreadPoolExecutor#getTask方法:

           try {
                Runnable r = timed ?
                    workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS) :
                    workQueue.take();
                if (r != null)
                    return r;
                timedOut = true;
            } catch (InterruptedException retry) {
                timedOut = false;
            }

这些要回收的线程最多可以存活keepAliveTime次。

线程池使用一个Hashtable来保存线程的引用,这样就可以通过增减引用等操作来控制线程的生命周期。(ThreadPoolExecutor#processWorkerExit方法) .