We already have so many answers and would suffice, but I always confused every other day. So I came up with a real time example to relate this!
A simple and efficient way to get this is by considering yourself being in a bank.
You ever stood in a line even though there is a window available?
Why would the bank keep a customer in a queue if there are available cash-window? That's exactly the case with core pool size
. If there are un-used threads, new tasks are directly allocated to them.

One the available window(core pool size) is full, customers are asked to wait in the queue. This is where the queue-capacity
comes in picture! New tasks are keep on queueing until no more tasks can be queued.

What if the wait-lounge is full of customers? Bank can allocate/open new cash-windows as they see spike in number of customers(tasks). They had 3 more in reserve.
Here comes the max pool size
in context.
Once these windows(threads) are all occupied, Bank can no longer server any new customers(tasks). Agree? And henceforth, new tasks are not accepted!
