【Android那些高逼格的写法】LinkedBlockingQueue与ArrayBlockingQueue

开始嘚啵

今天要对【Android那些高逼格的写法】做个说明,在这系列中所介绍的内容,没用过,或者用不到,并不影响写Android代码,但是如果掌握了这些语法,绝对会让你Android水平提升一个档次的。

好了,这次要介绍的是LinkedBlockingQueue与ArrayBlockingQueue。

在介绍之前需要先说明一下BlockingQueue。

BlockingQueue

阻塞队列,既然是队列那就是先进先出(FIFO),但是阻塞怎么理解呢,与别的队列有什么区别呢?

主要有两个方面

  1. 阻塞添加
    所谓的阻塞添加是指当阻塞队列元素已满时,队列会阻塞加入元素的线程,直队列元素不满时才重新唤醒线程执行元素加入操作。

  2. 阻塞删除
    阻塞删除是指在队列元素为空时,删除队列元素的线程将被阻塞,直到队列不为空再执行删除操作(一般都会返回被删除的元素)。

BlockingQueue是一个接口,并不能直接使用。而LinkedBlockingQueue与ArrayBlockingQueue就是实现了这个接口。

ArrayBlockingQueue

ArrayBlockingQueue 是一个用数组实现的有界阻塞队列,其中put方法和take方法为添加和删除的阻塞方法,老规矩,用代码做说明.

先写一个放入的操作:

《【Android那些高逼格的写法】LinkedBlockingQueue与ArrayBlockingQueue》 image

再写一个取出操作:

《【Android那些高逼格的写法】LinkedBlockingQueue与ArrayBlockingQueue》 image

这里注意,我在取出的时候,等待了三秒。

然后开始测试:

《【Android那些高逼格的写法】LinkedBlockingQueue与ArrayBlockingQueue》 image

这是一个容量为一的阻塞队列。我先开启了两个放入线程,又开启了两个取出线程,由于取出线程滞后三秒,所以应该是先执行两次放入,但是由于队列容量为1,所以当放入一个String之后,并不会进行第二个的放入,直到三秒后,执行了取出,才放入第二个。根据log可以说明这个步骤:

《【Android那些高逼格的写法】LinkedBlockingQueue与ArrayBlockingQueue》 image

LinkedBlockingQueue

同样的方式再来试一下LinkedBlockingQueue。

《【Android那些高逼格的写法】LinkedBlockingQueue与ArrayBlockingQueue》 image

看一下结果:

《【Android那些高逼格的写法】LinkedBlockingQueue与ArrayBlockingQueue》 image

为啥这个会先执行两次放入操作呢?

其实是一样的,在这里取出和放入操作基本上是同时完成的,但是为什么与ArrayBlockingQueue顺序不一样呢?

这是由于两者的实现队列添加或移除的锁不一样,ArrayBlockingQueue实现的队列中的锁是没有分离的,即添加操作和移除操作采用的同一个ReenterLock锁,而LinkedBlockingQueue实现的队列中的锁是分离的,其添加采用的是putLock,移除采用的则是takeLock。

除此之外还有其他几点却别:

  1. 队列大小有所不同,ArrayBlockingQueue是有界的初始化必须指定大小,而LinkedBlockingQueue可以是有界的也可以是无界的(Integer.MAX_VALUE)。

  2. ArrayBlockingQueue采用的是数组当做据存储容器,而LinkedBlockingQueue采用的则是链表方式,这与之前介绍的ArrayList和LinkedList类似。

更新说明

本文是来自我公号的文章,欢迎大家关注我的公众号,更快的更新更友爱的微信群更全的源码示例

《【Android那些高逼格的写法】LinkedBlockingQueue与ArrayBlockingQueue》 image

    原文作者:mymdeep
    原文地址: https://www.jianshu.com/p/8f9727d96137
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞