线程池的原理

简单选择排序过程中需要进行的比较次数与初始状态下待排序的记录序列的排列情况无关
线程池的基本原理
一 、并发队列
是一个基于链接节点的无界线程安全队列,采用先进先出规则对节点排序,添加元素至尾部,获取元素在队列头,
1、阻塞队列
插入的数据大于队列长度时,
入队,等待,什么时候又出来的,什么时候插入
出队,数据少于队列长度,出队时会等待,什么时候放进去,什么时候取出来
2、非阻塞队列
入队,插入数据大于队列长度时候,多于数据会丢失
出队,数据少于对队列长度会取出null值
线程就是基于阻塞队列实现的
二、线程池
也叫线程的集合,是多线程处理形式,将任务添加至队列,线程池会在启动时创建大量空闲线程,
程序将任务传给线程池,线程池启动一条线程来处理任务,执行结束后,线程不死亡,再次变为空闲状态,等待下个任务执行
其生命周期,新生,就绪,运行,死亡
3、原理
Executor接口的核心方法execute(),用来传入任务,实现类ThreadPoolExecutor,这也是线程的核心类,在其构造方法中有这些参数。

workQueue一般有以下三种阻塞队列:
threadFactory是当队列已满,但线程总数量<最大线程池大小时,线程池中用来创建新线程的线程工厂。
ArrayBlockingQueue:有界线程安全的阻塞队列。
LinkedBlockingQueue:并发安全的阻塞队列。
SynchronousQueue:同步队列。
handler触发时,有以下四种拒绝处理策略:
hreadPoolExecutor.AbortPolicy(默认):丢弃任务并抛出RejectedExecutionException(拒绝执行异常)异常。
ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。
ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务

三、
  首先创建一个最简单类型的线程池,构造方法只有五个参数,每个参数意义如下:
1:核心线程数corePollSize
2:最大线程数maximumPoolSize
3:空闲时间。新创建的线程执行任务后等待新任务的空闲时间TimeUnit.SECONDS:时间单位,秒
new LinkedBlockingDeque:(无界并发安全)阻塞队列,长度为3

现有一线程池,里面只有一个核心线程thread1,第一个任务进入线程池中,由thread1执行,而2-4号线程处在队列中等待执行,当5号任务提交时,根据原理图,此时满足队列已满,且核+新<=最大(1+1<=2),所以创建新线程thread2,由thread1和thread2分摊执行任务,由运行结果也可以看出,确实是分摊任务。
   当加上第6条的任务时,根据原理图,此时队列已满,且核+新>最大(1+1+1>2),没有多余的线程执行任务,队列也无法装入,就会报错,拒绝任务。
三、线程池的分类

  1. 可缓存:newCachedThreadPool
    作用:创建一个根据需要创建新线程池的线程池。当旧线程释放资源后就可以使用旧线程。
    特点:线程数灵活最大值为INTER.MAX_VALUE,底层采用一个近似无边界队列
  2. 定长:newFixedThreadPool
    作用:创建一个可重用固定线程数的线程池,以共享的无界队列来运行这些线程。
    特点:线程处于一定量,可以很好的控制并发量
  3. 定时:newScheduleThreadPool
    作用:创建一个可延迟或延期运行的线程池。
    特点:线程池中具有指定数量的线程,可定时或延迟执行,适用于周期性执行任务的场景。
  4. 单例:newSingleThreadExecutor
    作用:创建一个只有一个线程的线程池。且线程的存货时间是无限的,当该线程正繁忙时,对于新任务会进入无界的阻塞队列中。
    特点:适用于一个一个任务执行的场景。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值