线程池
一 Executor框架:
1.Executor框架的作用:为了更好地控制多线程,JDK提供了一套县城框架Executor,帮助开发人员有效地进行控制。它们都在java.util.concurrent包中,是JDK并发包的核心。其中有一个比较重要的类:Executors,他扮演着线程工厂的角色,我们通过Executors可以创建特定功能的线程池。
2.Executors创建线程池的方法:
1) newFixedThreadPool() :该方法返回一个固定数量的线程池。该方法的线程数始终不变,当有一个任务提交时,若线程池空闲,则立即执行。若没有,则会缓存在一个任务队列中等待有空闲的线程去执行。
2)newSingleThreadExecutor():创建只有一个线程的线程池,若空闲则执行,若没有空闲线程则暂缓在任务队列中。
3)newCachedThreadPool():返回一个可根据情况调整线程个数的线程池,不限制最大线程数量,若用空闲的线程则执行任务,若无任务则不创建线程,并且每一个线程会在空闲60s后自动回收
4)newScheduledThreadPool():该方法返回一个ScheduledExecutorService对象,但该线程池可以指定线程的数量。
二 深入解析线程池:
1.我们先查看Executor创建线程的底层代码:


我们会发现,Executor创建的线程池都调用了new ThreadPoolExecutor()这个构造方法,我们点进这个构造方法

发现最终这些构造方法都是调用的
public ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
这个构造方法,这个构造方法有七个参数,下面我们就来研究研究这个构造方法是怎样创建线程池的。
2.public ThreadPoolExecutor()的七大参数作用:
1)int corePoolSize:核心线程大小,表示在初始化时创建的线程数且在空闲时最少保持多少线程数。
2)int maximumPoolSize:表示最大允许的线程数。
3)long keepAliveTime:表示空闲时最长允许存活时间,超出这个时间该线程将会被回收
4)TimeUnit unit:枚举类型,指定keepAliveTime类型,可以是时、分、秒
5)BlockingQueue<Runnable> workQueue:选择何种队列保存工作任务
6)ThreadFactory threadFactory:选择线程工厂
7)RejectedExecutionHandler handler:拒绝策略,当线程池和工作队列已满是,选择何种拒绝策略拒绝执行再添加进来的工作任务
3.自定义线程池:当Executors中创建线程池的方法不满足业务需求时,也可以自己new ThreadPoolExecutor() 对象创建线程池。
自定义线程池使用详解:
1)new ThreadPoolExecutor()对于队列是什么类型的比较关键:
1> 在使用有界队列时,若有新的任务需要执行,如果线程池实际线程数小于corePoolSize,则优先创建线程,若大于corePoolSize,则会将任务加入队列,若队列已满,则在总线程数不大于maximumPoolSize的前提下,创建新的线程,若线程数大于maximumPoolSize,则执行拒绝策略或其他自定义方式。
2> 在使用无界队列时(LinkedBlockingQueue):与有界队列相比,除非系统资源耗尽,否则无界的任务队列不存在任务入队失败的情况。当有新的任务到来,系统的线程数小于corePoolSize时,则新建线程执行任务,当达到corePoolSize后,就不会继续增加。若后续仍有新的任务加入,而没有空闲的线程资源,则任务直接进入队列等待,若任务创建和处理的速度差异很大,无界队列会保持快速增长,知道耗尽系统资源。
2)JDK拒绝策略:JDK自带了四种拒绝策略,分别是:
1> AbortPllicy:直接抛出异常组织系统正常工作。
2> CallerRunsPolicy:只要线程池未关闭,该策略直接在调用者线程中运行当前被丢弃的任务。
3> DiscardOldestPolicy:丢弃最老的一个请求,尝试再次提交当前任务。
4> DiscardPolicy:直接丢弃任务,不给予任何提示或处理。
如果需要自定义拒绝策略可以实现RejectedExecutionHandler接口

浙公网安备 33010602011771号