线程池简介
使用多线程编程时,线程的数量并不是越多越好,并且一直开新线程,对资源的消耗很大,你处理一段逻辑消耗的资源可能仅仅占用百分之十,而新建线程销毁线程这些生命周期就占据了资源的百分之九十。
所以线程最好可以回收利用,不是说你这个线程执行了这个任务,你就可以go die了,不,你还可以继续给老板挣法拉利。
线程做到了重复使用,但是不能让线程给你瞎搞吧,天天划水怎么办,光吃不干,领导们不喜欢这样的线程,所以线程池们要对你们进行管理,让你打狗不要去撵鸡。
线程的生命周期
线程有生命周期,线程池有状态。
线程有五个阶段,线程池有五个状态。
1、新建
2、就绪
3、运行
4、阻塞
5、终止
线程池状态
RUNNING:接受新任务并处理排队的任务
SHUTDOWN:不接受新任务,但处理排队的任务
STOP:不接受新任务,不处理排队的任务,中断正在进行的任务
TIDYING:所有任务都已终止。
TERMINATED:已完成。
最简单的线程池操作方法
ThreadPoolExecutor类:
·························重点来袭·························
int corePoolSize
核心线程数量,你打算这个线程池根据业务需求,大概需要多少个线程。创建线程池后,池子中线程数量为0,来一个请求,开一个线程。
int maximumPoolSize
线程池最大能创建多少个线程,由这个参数决定。
long keepAliveTime
线程最大空闲时间,这个参数对核心线程无效,核心线程比较厉害,谁都管不了它。只有当前线程>核心线程时,空闲时间才会生效,如果此时某个线程空闲时间达到了这个点,就终止。
TimeUnit unit
时间单位。
TimeUnit.DAYS.
TimeUnit.HOURS.
TimeUnit.MINUTES.
TimeUnit.SECONDS.
TimeUnit.MILLISECONDS.
TimeUnit.MICROSECONDS.
TimeUnit.NANOSECONDS.
BlockingQueue workQueue
线程等待队列,存放等待执行的任务。
ArrayBlockingQueue:基于数组,创建时指定大小,排队的任务是有限度的。
LinkedBlockingQueue:基于链表,无界队列,核心线程已满后,进入的所有任务进入队列,直到资源耗尽。
SynchronousQueue:不是队伍,直接新建线程,执行任务。
ThreadFactory threadFactory
线程创建工厂。
RejectedExecutionHandler handler
拒绝策略,如果当前线程已经达到了最大线程数,则执行拒绝策略。
ThreadPoolExecutor.AbortPolicy:抛出异常。
ThreadPoolExecutor.DiscardPolicy:丢弃任务,不抛出异常。
ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新执行任务。
ThreadPoolExecutor.CallerRunsPolicy:调用者线程处理任务
整体流程
上边参数是让你自己设计一个线程池,非常重要的一个点是线程数量。
当前<核心,创建新线程处理请求。
核心<当前>最大,进入等待队列,等待执行。
核心=最大,创建固定大小的线程池。
最大线程数为无穷大,线程池无限制开新线程。
总体流程为:
第一步: 接收请求,判断当前线程数与核心线程数的大小:
·············若小于核心线程数,则开新线程执行任务。
·············若大于核心线程数,则进入等待队列。
第二步:等待队列,判断队列是否满员,这一步很重要,不仅仅是判断队列满员没有,还要看设置的排队策略。
············若未满员,就可以进去,等待执行。
············若满员,进入失败,根据相应的排队策略执行不同的操作。
第三步:判断当前线程数与最大线程数的大小
············若大于最大线程数,则执行拒绝策略。
············若小于最大线程数,则提交任务等待执行。
如果你想省事一点,可以直接使用JDK提供的,明白了这七个参数代表含义,下面这四个也就ok了。
1、newFixedThreadPool
2、newCachedThreadPool
3、newSingleThreadExecutor
4、newSingleThreadScheduledExecutor
线程池关闭方法
1、shutdown:有序的关机,执行方法后,不再接收新任务,队列中任务全部执行完毕后关机。
2、shutdownNow:强制性关闭所有未执行及正在执行的任务,瞬时关机,返回尚未执行的任务。
·············································································
你学废了吗