我把线程池参数给做个形象的比喻,线程池 就好比一个水池,池底有N个小洞,就是核心线程数量N,最大线程数量就是这个池子能装多少个桌球,等待队列 就是池子之外的一块地方,有的队列是有界的,就是大小固定,有的是无界的,大小不固定。
任务 就是把桌球丢到池子中,让桌球从池底的小洞掉下去。相当于线程的执行。
当前线程小于核心线程N的时候,则直接创建线程,否则就进入等待队列中等待,如果队列的大小是不固定的,就是多少线程都会进入到队列中,线程池中的线程数量就是核心线程数量,这个时候最大线程数量就没有任何意义了。如果队列的大小是固定的,当队列满的时候还有新的任务进来,则在线程池中创建线程,处于等待状态。如果线程池满了,就执行拒绝策略。
我们用上面的例子来说明这个问题 ,当掉入池子中桌球小于池底的小洞数量的时候,这些桌球就会掉入洞中,假设掉入是需要一定的时间的,慢慢掉入,(模拟任务的执行时间)。持续的桌球不断的从外面掉入池子中,直到底部已经没有空闲的小洞可以塞了,这个时候不在洞中的桌球不能放在池中,只能放在外面的那块空地等待,如果那块空地的面积是足够大的,多少球都放的下,这种情况下,新进来的球来多少都放在那块空地上等待。如果那块空地大小有限,只能放固定数量的桌球。当空地放满桌球的时候,新来的桌球放不下了并且池子还没满(没满的意思就是核心线程数小于最大线程数量),这个时候才可以放入水池中。整个过程中 如果任何新进来的桌球发现池底的小球穿过了小洞,小洞变成了空洞,这个时候新进来的桌球可以直接放到小洞中去。
假设我们创建了一个核心线程数为2 最大线程数为4 ,队列长度为5的有界队列 线程池。
这时有六个任务进来,前面进来的两个任务直接在线程池中创建,接下来的四个线程放入队列中,因为队列的长度是五,可以放的下。此时线程池中只有两个任务在执行,执行完了再从队列中取出任务来创建线程。
注意要点:最大线程数 用的着的时候是 队列大小固定,并且队列已经满了,还有任务进来才有用,否则无用,
因为线程进来的顺序是 先创建核心线程数量的线程,然后就进入队列等待 ,队列满了 ,才进入线程池(最大线程大于核心线程数)