BlockingQueue一些特性

特性:BlockingQueue为空时,从BlockingQueue取值的操作将会被阻断进入等待状态,直到BlockingQueue中有值才会被唤醒,

           BlockingQueue为满时,往BlockingQueue存储的操作也会被阻断进入等待状态,直到BlockingQueue不为满才会被唤醒继续操作。

可以使用此特性对其他线程控制,节约CPU资源。

BlockingQueue有四个具体的实现类,只从名字来看,可以知道各种队列的底层实现:

ArrayBlockingQueue:(数组实现的阻塞队列)
    规定大小的BlockingQueue,其构造函数必须带一个int参数来指明其大小。其所含的对象是以FIFO(先入先出)顺序排序的。

LinkedBlockingQueue:(链表实现的阻塞队列)
     大小不定的BlockingQueue,若其构造函数带一个规定大小的参数,生成的BlockingQueue有大小限制,若不带大小参数,所生成的BlockingQueue的大小由Integer.MAX_VALUE来决定。其所含的对象是以FIFO顺序排序的。

PriorityBlockingQueue:(按照排序规则进行排序的有序队列)
     类似于LinkedBlockingQueue,但其所含对象的排序不是FIFO,而是依据对象的自然排序顺序或者是构造函数所带的
Comparator决定的顺序。

SynchronousQueue:(放和取交替完成)
   特殊的BlockingQueue,对其的操作必须是放和取交替完成的。

LinkedBlockingQueue和ArrayBlockingQueue比较起来,它们背后所用的数据结构不一样,导致LinkedBlockingQueue的数据吞吐量要大于ArrayBlockingQueue,但在线程数量很大时其性能的可预见性低于ArrayBlockingQueue。

按数组格式存储的ArrayBlockingQueue要求内存连续,因此能够存储的数据量较小,支持随机访问,因此在多线程访问的时候底层实现不需要按照队列的顺序取值。

按数链表格式存储的LinkedBlockingQueue不要求内存连续,因此能够存储的数据量小,只支持顺序访问,因此在多线程访问的时候底层实现必须按照队列顺序访问线程访。


猜你喜欢

转载自blog.csdn.net/cherishpart/article/details/49947209