记忆阻塞的两个方法
- ArrayBlockingQuque
- 默认情况下不保证线程公平访问队列
- 可以设置公平访问,公平性通过可重入锁实现
- LinkedBlockingQueue
- 默认和最大长度为Intger.MAX_VALUE
- PriorityBlockingQueue
- 支持优先级
- 无界
DelayQueue
- 支持延时获取元素
- 无界
- 队列中元素必须实现Delayed接口
- 应用:定时任务
如何实现Delayed接口? 可以参考ScheduledFutureTask类实现。
- 创建对象,初始化数据并使用sequenceNumber标识元素的优先级
- 实现getDelay方法,方法返回 N 纳秒后执行
- 实现compareTo方法
延时阻塞队列怎么实现的?
- 实现思路就是从队列获取元素,若没达到延时时间就阻塞当前线程
- leader是一个等待获取队列头部元素的线程(leader是个线程)
- leader不为空,使用await()方法让当前线程等待消息
- leader为空,则吧当前线程设置为leader,并使用awaitNanos方法
SynchronousQueue
- 不存储任何数据
- 看成一个传球手
- LinkedTransferQueue
- 多了tryTransfer和transfer方法
- transfer可以把生产者传入的数据立刻给正在等待的消费者。会一直等
- tryTransfer会立即返回,可以指定时间
- LinkedBlockingDeque