强烈推荐,线程池是怎么工作的!

线程池简介

使用多线程编程时,线程的数量并不是越多越好,并且一直开新线程,对资源的消耗很大,你处理一段逻辑消耗的资源可能仅仅占用百分之十,而新建线程销毁线程这些生命周期就占据了资源的百分之九十。

所以线程最好可以回收利用,不是说你这个线程执行了这个任务,你就可以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:强制性关闭所有未执行及正在执行的任务,瞬时关机,返回尚未执行的任务。

·············································································
你学废了吗

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值