线程池综述
它的主要特点为:线程复用;控制最大并发数;管理线程。
使用线程池的好处有
第一:降低资源消耗。通过重复利用已创建的线程,降低线程创建和销毁带来的资源消耗
第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建好就可以立即执行。
第三:提高线程的可管理性。线程是稀缺资源,如果无限制创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配,调优和监控。
线程池的工作流程
1、在创建了线程池后,等待提交过来的任务请求。
2、当调用execute()方法添加一个请求任务时,线程池会做如下判断:
2.1、如果正在运行的线程数量小于corePoolSize,那么马上创建线程运行这个任务;
2.2、如果正在运行的线程数量大于或等于corePoolSize,那么将这个任务放入队列;
2.3、如果这个时候队列满了且正在运行的线程数量还小于maximunPoolSize,那么还是要创建非核心线程来运行这个任务;
2.4、如果这个时候队列满了且正在运行的线程数量大于或等于maximumPoolSize,那么线程池会启动饱和拒绝策略来执行。
3、当一个线程完成任务后,它会从队列取下一个任务来执行。
4、当一个线程无事可做超过一定的时间(keepAliveTime)时,线程池会判断:
4.1、如果当前运行的线程数大于corePoolSize,那么这个线程就会被停掉;
4.2、所以线程池的所有任务执行完成后它最终会收缩到corePoolSize的大小。