线程池的好处:
其实每个线程都是为了完成某个业务功能任务,假设某个功能A任务,需要执行10000次,那么如果正常操作的话可能要创建10000次线程,每个线程去完成A任务,完成后这10000个线程再回收销毁。想想就知道这个有多浪费资源,线程是宝贵的资源,频繁的创建和销毁消耗的资源是很大的,而且很有可能创建和销毁资源的时间会超过业务执行的时间
如过使用线程池,假设这线程池的大小为10个线程,那么这10个线程在创建后就会不断的去执行那10000个A任务,执行一个后不会销毁而是会继续执行下一个,这样10000个A任务执行完后,只销毁了10个创建线程的资源,所以线程池在节约资源上的作用显而易见
Java线程池ThreadPoolExecutor
ThreadPoolExecutor的构造参数如下:
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler);
corePoolSize:线程池核心线程数量
maximumPoolSize:线程池最大线程数量
keepAliverTime:当活跃线程数大于核心线程数时,空闲的多余线程最大存活时间
unit:存活时间的单位
workQueue:存放任务的队列
handler:超出线程范围和队列容量的任务的处理程序
线程池的粗略处理流程:
假设这个线程池创建时,核心线程数是10,最大线程数是100
1:当第1~10个任务进来时,线程池会一个一个创建核心线程,最后10个核心线程被创建,这10个线程创建执行万任务后不会 被销毁,会从任务队列workQueue中获取下一个任务(获取不到就会阻塞,这里设计到阻塞队列的使用)
2:当第11~AA(并发承受范围内)个任务进来时,会保存到任务队列workQueue中,从而被核心线程获取,核心线程执行玩后再从队列中获取下一个任务,正常情况下,在并发量在承受范围内的时候,任务队列的进任务和出任务会保持平衡,任务队列不会被挤爆
3:当第AA~BB(并发太大,短时间承受不太住)个任务进来时,此时10个核心线程的处理任务速度比不上任务队列增加的速度,时间厂里任务队列就满了,这时候再有任务进来就会分配到临时线程中(90个),让临时线程去处理,来减缓核心线程和任务队列的压力,当高峰时间过去后,线程池压力回复正常,核心线程可以处理后,临时线程存活时间到了后还没有新的任务过来就会被回收销毁
4:当第BB~CC (并发极大,线程池撑不住了 )个任务进来时,这时候100个线程都处理不过来,一个空闲线程都没有,任务队列也是满的,这时候再进来一个任务,就会交给handler处理(可以自定义处理方式,一般是抛出异常,也可以等待,或者其他自定义操作)
以上的流程都是我粗浅的理解,部分内容可能与实际不符合,请看客们适当获取知识