Home > Back-end >  Threads are increasing but not decreasing when the task finished in Java
Threads are increasing but not decreasing when the task finished in Java

Time:09-17

I have an application that I did thread configuration as follows,

corepoolsize = 10
maxpoolsize = 10
queuecapacity = 10

But when I do use Threads and functions that run on threads (asynchronous process) I see it is increasing like the follows, But I don't see the threads are decreasing. Is that a indication of memory leak? Can anybody guide me?

Log prints like this,

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]

But I don't see it is calling again [Async-1], [Async-2] like that. Is this a memory leak or a thread cache or after filling up corepoolsize then will it run [Async-1]?

CodePudding user response:

Corepoolsize represents the worker thread that is always alive.

You can check ThreadPoolExecutor#runWorker, ThreadPoolExecutor#getTask method, these worker threads will always try to get tasks from the task queue and execute them. So if no new tasks are posted to the thread pool, then these worker threads will always live, usually blocked in the take method of workQueue, So you don't have to worry about the cpu idling.

Worker threads outside the number of corepoolsize will be recycled, still ThreadPoolExecutor#getTask method:

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

These threads to be recycled can survive at most keepAliveTime time.

The thread pool uses a Hash table to hold the thread's reference, so that the life cycle of the thread can be controlled by operations such as adding and removing references.(ThreadPoolExecutor#processWorkerExit method).

CodePudding user response:

This is expected behaviour. The documentation for ThreadPoolExecutor explicitly states:

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.

  • Related