1700450751
1700450752
this.keepAliveTime=unit.toNanos(keepAliveTime);this.threadFactory=threadFactory;
1700450753
1700450754
this.handler=handler;
1700450755
1700450756
}
1700450757
1700450758
}
1700450759
1700450760
这是ThreadPoolExecutor最完整的构造函数,其他的构造函数都是引用该构造函数实现的,我们逐步来解释这些参数的含义。
1700450761
1700450762
corePoolSize:最小线程数。
1700450763
1700450764
线程池启动后,在池中保持线程的最小数量。需要说明的是线程数量是逐步到达corePoolSize值的,例如corePoolSize被设置为10,而任务数量只有5,则线程池中最多会启动5个线程,而不是一次性地启动10个线程。
1700450765
1700450766
maximumPoolSize:最大线程数量。
1700450767
1700450768
这是池中能够容纳的最大线程数量,如果超出,则使用RejectedExecutionHandler拒绝策略处理。
1700450769
1700450770
keepAliveTime:线程最大生命期。
1700450771
1700450772
这里的生命期有两个约束条件:一是该参数针对的是超过corePoolSize数量的线程;二是处于非运行状态的线程。这么说吧,如果corePoolSize为10,maximumPoolSize为20,此时线程池中有15个线程在运行,一段时间后,其中有3个线程处于等待状态的时间超过了keepAliveTime指定的时间,则结束这3个线程,此时线程池中则还有12个线程正在运行。
1700450773
1700450774
unit:时间单位。
1700450775
1700450776
这是keepAliveTime的时间单位,可以是纳秒、毫秒、秒、分钟等选项。
1700450777
1700450778
workQueue:任务队列。
1700450779
1700450780
当线程池中的线程都处于运行状态,而此时任务数量继续增加,则需要有一个容器来容纳这些任务,这就是任务队列。
1700450781
1700450782
threadFactory:线程工厂。
1700450783
1700450784
定义如何启动一个线程,可以设置线程名称,并且可以确认是否是后台线程等。
1700450785
1700450786
handler:拒绝任务处理器。
1700450787
1700450788
由于超出线程数量和队列容量而对继续增加的任务进行处理的程序。
1700450789
1700450790
线程池的管理是这样一个过程:首先创建线程池,然后根据任务的数量逐步将线程增大到corePoolSize数量,如果此时仍有任务增加,则放置到workQueue中,直到workQueue爆满为止,然后继续增加池中的线程数量(增强处理能力),最终达到maximumPoolSize,那如果此时还有任务要增加进来呢?这就需要handler来处理了,或者丢弃新任务,或者拒绝新任务,或者挤占已有任务等。
1700450791
1700450792
在任务队列和线程池都饱和的情况下,一旦有线程处于等待(任务处理完毕,没有新任务增加)状态的时间超过keepAliveTime,则该线程终止,也就是说池中的线程数量会逐渐降低,直至为corePoolSize数量为止。
1700450793
1700450794
我们可以把线程池想象成这样一个场景:在一条生产线上,车间规定是可以有corePoolSize数量的工人,但是生产线刚建立时,工作不多,不需要那么多的人。随着工作数量的增加,工人数量也逐渐增加,直至增加到corePoolSize数量为止,此时任务还在增加,那怎么办呢?
1700450795
1700450796
好办,任务排队,corePoolSize数量的工人不停歇地处理任务,新增加的任务按照一定的规则存放在仓库中(也就是我们的workQueue中),一旦任务增加的速度超过了工人处理的能力,也就是说仓库爆满时,车间就会继续招聘工人(也就是扩大线程数),直至工人数量达到maximumPoolSize为止,那如果所有的maximumPoolSize工人都在处理任务,而且仓库也是饱和状态,新增任务的该怎么处理呢?这就会扔给一个叫handler的专门机构去处理了,它要么丢弃这些新增的任务,要么无视,要么替换掉别的任务。
1700450797
1700450798
过了一段时间后,任务的数量逐渐减少了,导致有一部分工人处以待工状态,为了减少开支(Java是为了减少系统资源消耗),于是开始辞退工人,直至保持为corePoolSize数量的工人为止,此时即使没有工作,也不再辞退工人(池中线程数量不再减少),这也是为了保证以后再有任务时能够快速的处理。
1700450799
1700450800
明白了线程池的概念,我们再来看Executors提供的几个创建线程池的便捷方法:
[
上一页 ]
[ :1.700450751e+09 ]
[
下一页 ]