Java基础(八) ---- 线程池

基础介绍

含义:线程池就是一个容器,存放多个线程,只需将任务对象提交给线程池,线程池即可自动安排线程处理

了解:线程完成一项任务的时间 1.创建线程 2.使用线程 3.销毁线程

线程池优点

  • 线程池技术优化了time1与time3的时间,可以将创建线程池放在线程启动时,销毁线程放在项目销毁时
  • 有效控制项目中线程的个数
  • 提高了线程的复用率,节约系统资源,提高系统响应速度与吞吐量
  • 线程池能限制并发执行的线程数,控制系统中的并发度,通过配置线程池可有效避免过多线程的资源竞争

自带线程池

单个线程的线程池:Executors.newSingleThreadExecutor()底层使用无界队列,有内存溢出风险
指定线程个数的线程池:Executors.newFixedThreadPool(num)底层使用无界队列,有内存溢出风险

带有缓存线程线程池:Executors.newCachedThreadPool()最大线程数Integer.MAX_VALUE线程个数不可控

延迟提交的线程池:Executors.newSingleThreadScheduledExecutor()线程个数不可控

七大参数

核心线程数、最大线程数、任务队列、拒绝策略、闲置时间、时间单位、线程工厂

任务顺序:1.核心线程 2.任务队列 3.普通线程 4.拒绝策略

任务队列

LinkedBlockingQueue

无界队列,最大线程数设置无效,当前线程池最大线程数为核心线程数,任务队列中一直添加可能会造成资源耗尽、内存溢出的问题

SynchronousQueue

同步队列/直接提交队列,该队列没有容量,每执行一个插入操作就会阻塞,需要再执行一个删除操作才会被唤醒,反之每一个删除操作也都要等待对应的插入操作。创建线程数大于最大线程数会进入拒绝策略抛出异常

ArrayBlockingQueue

有界队列,核心线程数满载后,任务进入有界队列,任务大于有界队列初始值后,创建普通线程,线程达到最大线程数量后,执行拒绝策略

PriorityBlockingQueue

优先任务队列 ,是一个特殊的无界队列,可自定义排序任务优先级先后执行

拒绝策略:默认报错

AbortPolicy

当有任务添加到线程池被拒绝时,会抛出RejectedExecutionException异常,线程池默认的拒绝策略。必须处理好抛出的异常,否则会打断当前的执行流程,影响后续的任务执行

DiscardPolicy

当有任务添加到线程池被拒绝时,直接丢弃,其他啥都没有

CallerRunsPolicy

当有任务添加到线程池被拒绝时,线程池会将被拒绝的任务添加到线程池正在运行的线程中去运行。 一般并发比较小,性能要求不高,不允许失败。但是,由于调用者自己运行任务,如果任务提交速度过快,可能导致程序阻塞,性能效率上必然的损失较大

DiscardOldestPolicy

当有任务添加到线程池被拒绝时,线程池会丢弃阻塞队列中末尾的任务(最老的任务),然后将被拒绝的任务添加到末尾。如果项目中有允许丢失任务的需求,可以使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值