当任务在 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#runWorker
、ThreadPoolExecutor#getTask
方法,这些工作线程会一直尝试从任务队列中获取任务并执行。所以如果没有新的任务发布到线程池,那么这些工作线程会一直存活,通常会阻塞在workQueue
的take
方法中,所以不用担心[=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
方法) .
我有一个应用程序,我按如下方式配置了线程,
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#runWorker
、ThreadPoolExecutor#getTask
方法,这些工作线程会一直尝试从任务队列中获取任务并执行。所以如果没有新的任务发布到线程池,那么这些工作线程会一直存活,通常会阻塞在workQueue
的take
方法中,所以不用担心[=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
方法) .