线程池内部是通过线程和队列实现的,当我们通过线程池处理任务时:
如果线程池中的线程数量小于corePoolSize,无论是否有处于空闲的线程,都创建新的线程来处理被添加的任务。
如果线程池中的线程数量等于corePoolSize,缓冲队列workQueue未满,则将被添加的任务放入缓冲队列。
如果线程池中的线程数量大于等于corePoolSize,缓冲队列workQueue已满,但是线程数量小于maximumPoolSize,那么创建新的线程来处理被添加的任务。
如果线程池中的线程数量大于corePoolSize,缓冲队列workQueue已满,并且线程数量等于maximumPoolSize,那么通过handler指定的策略来处理被添加的错误。
如果线程池中的线程数量大于corePoolSize,当线程空闲时间大于keepAliveTime,就将这个线程终止,这样线程池就可以动态调整池中线程数量。
线程池为什么先添加队列而不是先创建最大线程?
当线程池中的核心线程都在忙时,如果继续往线程池中添加任务,那么队伍会先放入队列,队列满了之后才会新开线程。这就相当于,一个公司有10名程序员,本来这10名程序员就能正常处理业务,但随着公司发展,业务量慢慢增加,但是一开始这些需求只会增加在待开发列表中,然后10个程序员加班加点的从待开发列表中获取并进行处理,直到某天开发列表满了,公司现有的程序员真的处理不过来了,所以就开始招员工了。