poll(long timeout, TimeUnit unit)
poll(long timeout, TimeUnit unit) 方法是在一定时间内出队还未取到元素就阻塞线程,时间到了还没取到元素就返回 null,并不会一直阻塞线程。
take()
take() 方法和 poll() 最大的不同就是在空队列的时候会一直阻塞线程,poll() 则返回 null,poll(long timeout, TimeUnit unit) 则在一定时间内阻塞线程,超时后返回的 null。
remove()
remove() 并不会弹出元素,它是删除一个元素。遍历整个单向链表,找到需要删除的元素后,将元素前一个节点的next 指向删除元素的 next。将需要删除的元素设置为 null。
peek()
peek() 方法仅仅是取出第一个元素,没有修改节点的任何一个 next 属性,所以并不会将元素从队列中移除。
出队总结
LinkedBlockingQueue 的出队一共有 poll()、take()、poll(long timeout, TimeUnit unit) 三种方法,移除元素用 remove() 方法,取出第一个元素用 peek() 方法。
出队方法在遇到空队列的时候操作不同:
- poll() 方法遇到空队列就返回 null。
- take() 方法遇到空队列就将线程加入到 notEmpty 条件队列中并且阻塞线程。
- poll(long timeout, TimeUnit unit) 方法在遇到空队列就阻塞一段时间,这期间没获取到元素就返回 null。
总结
- LinkedBlockingQueue 是基于单向链表的,线程安全的。
- 是一个有界的队列,最大的容量是最大的 int 值。
- 出队入队基于两把锁。互不阻塞。
LinkedBlockingQueue 被用在线程池中,也可以用在生产者-消费者模式中。
我是指北君,操千曲而后晓声,观千剑而后识器。感谢各位人才的:点赞、收藏和评论,我们下期更精彩!