阻塞队列(BlockQueue)
- 非阻塞方法
add
往满的队列中添加元素会报错remove
从空的队列中移除元素会报错offer
往满的队列中添加元素会返回falsepoll
从空的队列中移除元素会返回null
- 阻塞方法
put
take
使用场景:
阻塞队列通常使用在生产者消费者设计模式当中,生产者不用关心生成的产品由哪个消费者来执行,只需将生产的产品放入队列中,消费者直接从队列中取出产品使用,达到了生产者与消费者之间解耦的目的和性能均衡问题.
常用的阻塞队列有哪些?
- ArrayBlockQueue 一个由数组结构组成的有界阻塞队列
- LinkedBlockQueue 一个由链表结构组成的有界阻塞队列
- PriorityBlockQueue 一个支持优先级排序的无界阻塞队列
- DelayQueue 一个使用优先级排序的无界阻塞队列
- SyschronizedQueue 一个不存储元素的阻塞队列
- LinkedTransferQueue 一个由链表结构组成的无界阻塞队列
- LinkedBlockQueue 一个由链表结构组成的双向阻塞队列
什么是线程池
?为什么要用线程池
?
线程池是用来管理线程的.
因为线程的创建、执行和销毁都是需要耗费时间和资源的,所以通过线程池来避免线程的重复创建和销毁
线程池ThreadPoolExecutor
(/ɪɡˈzekjətər/)工作机制
-
线程池的创建 (各个参数的含义)
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
-
提交任务
execute(Runnable)
没有返回值submit(Callable/Runnable)
有返回值,返回Future
,最终还是交给execute
去执行的
-
线程池的关闭
showDown
将正在执行的线程以外的线程关闭showDownNow
将正在执行的线程和以外的线程都关闭
线程池中参数的含义
corePoolSize
核心线程数,当前可执行线程的数量maximumPoolSize
最大线程数,当阻塞队列存满后,将会创建新的线程来执行任务(执行的任务是当前的任务,而非阻塞队列中的任务)keepAliveTime
控制空闲线程存活时间unit
控制空闲线程存活时间单位(ms、s)workQueue
阻塞队列,如果要执行的线程数超过核心线程数,将会会放在阻塞队列中,阻塞队列存满后,依据最大线程数将会创建新的线程来执行任务threadFactory
对创建线程做一些调节handler
拒绝策略,超出线程池执行能力以外的任务拒绝执行,最多可以执行1100个线程,超过的不予执行
RejectedExecutionHandler(拒绝策略)
- CallerRunsPolicy
AbortHandler
通常默认的拒绝策略是这一个,直接抛出异常- DiscardPolicy
- DiscardOldestPolicy