BlockingQueue接口和线程池

本文详细介绍了Java中线程池和BlockingQueue的工作原理,包括不同类型的队列如ArrayBlockingQueue、DelayQueue等特性,以及ThreadPoolExecutor的七个构造参数。同时,探讨了线程池的提交方法、关闭方式、查询功能和状态转换,最后分析了线程数量的选择和适合使用线程池的任务类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

BlockingQueue接口和线程池

BlockingQueue接口

它有四套api,add/remove操作失败会直接抛出异常,offer/poll操作失败会返回特殊值,还可以加时间,过了时间返回失败,put/take操作失败会阻塞。

ArrayBlockingQueue:是数组实现的,必须构造时传入大小,传入后不可改变。

DelayQueue:实现Delay接口,与排序有关,它是一个可以实现排序的队列,内部就是堆

LinkedBlockingQueue:可以指定大小也可以不指定,内部实现是链表

PriorityBlockingQueue:是有优先级的队列,允许插入元素为null,所有其中对象必须实现Comparable接口。

SynchronousQueue:内部仅容纳一个元素,当一个线程放入元素后就会被阻塞,直到这个元素被消费,又称为同步队列

线程池ThreadPoolExecutor

ThreadPoolExecutor的7个构造参数:

核心线程数量:如果运行线程数少于这个值直接创建新线程,即使线程池中线程是空闲的

最大线程数:当大于核心线程少于最大线程时,只有当阻塞队列满了才会创建新线程,当核心线程数和最大线程数相同的时候,线程池大小是固定的,新任务提交会把它放在阻塞队列中等待。

阻塞队列:有三种模式,第一就是使用SynchronousQueue,它会把任务直接切换到运行态,当为无界队列(linked)时最大线程数这个参数就会失效,还有有界队列(array)。如果为有界队列,那么队列容量、核心线程数、最大线程数三个参数可以好好调节,如果要降低CPU消耗可以设置大队列小线程池,提升CPU使用率要设置小队列大线程池,线程池大小也不能太大,否则效率反而会变小

线程空闲时间:空闲的线程多久会被回收

时间单位

线程工厂:默认所有线程都有相同的优先级

拒绝策略:队列满了且没有空闲线程时,如果提交任务就会采用策略来对待这个任务,默认为直接抛出异常,还可以用调用者所在线程执行任务、丢弃队列中最靠前的任务执行当前任务、直接丢弃这个任务。

Executors

Executors可以创建的线程池:返回值都是ExecutorService,它没有查询功能。

newCachedThreadPool,一个可以动态大小的线程池,可以灵活回收或新建

newFixedThreadPool,一个固定大小的线程池,可以控制线程的最大并发数,超出的放入队列等待。

newScheduledThreadPool:一个定长的线程池,支持定时和周期任务执行,它调用schedule可以设置延时一段时间后执行,还可以以指定速率执行任务,指定的延时间隔执行任务

newSingleThreadExecutor:一个单线程的线程池,保证任务串行

线程池的方法

线程池提交:execute和submit,后者可以结合future得到线程计算结果

线程池关闭:shutdown和shutdownNow,后者不会等待任务执行完

线程池查询:可以得到任务总数(包括已经执行的)、已完成的任务数量、当前线程数量、正在执行任务的线程数量。

线程池的状态

running:能处理新任务,也可以处理阻塞队列中的任务

shutdown:不能接受新任务,但是可以处理阻塞队列中的任务,调用shutdown方法可以到该状态。

stop:不能接受新任务,也不处理阻塞队列中的任务,调用shutdownNow会进入该状态

tidying:所有任务都完成了进入该状态

terminated:从tidying转变过来的最终状态

线程数量和线程池任务选择

线程数量:CPU密集型要尽量压榨CPU,设置为CPU数+1,而IO密集型要设置为2倍的CPU数量

适合用线程池的任务:大任务。如果任务执行的速度和线程池管理的速度相当,反而会降低程序运行速度。

转载于:https://www.cnblogs.com/shizhuoping/p/11548840.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值