10.阻塞队列和线程池

阻塞队列(BlockQueue)

  • 非阻塞方法
    • add 往满的队列中添加元素会报错
    • remove 从空的队列中移除元素会报错
    • offer 往满的队列中添加元素会返回false
    • poll 从空的队列中移除元素会返回null
  • 阻塞方法
    • put
    • take

使用场景:
阻塞队列通常使用在生产者消费者设计模式当中,生产者不用关心生成的产品由哪个消费者来执行,只需将生产的产品放入队列中,消费者直接从队列中取出产品使用,达到了生产者与消费者之间解耦的目的和性能均衡问题.

常用的阻塞队列有哪些?

  • ArrayBlockQueue 一个由数组结构组成的有界阻塞队列
  • LinkedBlockQueue 一个由链表结构组成的有界阻塞队列
  • PriorityBlockQueue 一个支持优先级排序的无界阻塞队列
  • DelayQueue 一个使用优先级排序的无界阻塞队列
  • SyschronizedQueue 一个不存储元素的阻塞队列
  • LinkedTransferQueue 一个由链表结构组成的无界阻塞队列
  • LinkedBlockQueue 一个由链表结构组成的双向阻塞队列

什么是线程池?为什么要用线程池?
线程池是用来管理线程的.
因为线程的创建、执行和销毁都是需要耗费时间和资源的,所以通过线程池来避免线程的重复创建和销毁

线程池ThreadPoolExecutor(/ɪɡˈzekjətər/)工作机制

  1. 线程池的创建 (各个参数的含义)
    public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)

  2. 提交任务

    • execute(Runnable) 没有返回值
    • submit(Callable/Runnable) 有返回值,返回Future,最终还是交给execute去执行的
  3. 线程池的关闭

    • showDown 将正在执行的线程以外的线程关闭
    • showDownNow 将正在执行的线程和以外的线程都关闭

线程池中参数的含义

  • corePoolSize 核心线程数,当前可执行线程的数量
  • maximumPoolSize 最大线程数,当阻塞队列存满后,将会创建新的线程来执行任务(执行的任务是当前的任务,而非阻塞队列中的任务)
  • keepAliveTime 控制空闲线程存活时间
  • unit 控制空闲线程存活时间单位(ms、s)
  • workQueue 阻塞队列,如果要执行的线程数超过核心线程数,将会会放在阻塞队列中,阻塞队列存满后,依据最大线程数将会创建新的线程来执行任务
  • threadFactory 对创建线程做一些调节
  • handler 拒绝策略,超出线程池执行能力以外的任务拒绝执行,最多可以执行1100个线程,超过的不予执行

RejectedExecutionHandler(拒绝策略)

  • CallerRunsPolicy
  • AbortHandler 通常默认的拒绝策略是这一个,直接抛出异常
  • DiscardPolicy
  • DiscardOldestPolicy
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值