21道并发编程口试题(11)

  在新增呢的concurrent包中,BlockingQueue很好的办理了多线程中,如何高效安详“传输”数据的问题,通过这些高效而且线程安详的行列类,为我们快速搭建高质量的多线程措施带来极大的便利;

  常用的行列主要由以下两种:

    1.先进先出(FIFO):先插入的行列的元素也最先出行列,雷同于列队的成果,从某种水平上来说这种行列也浮现了一种公正性;

    2.后进后出(LIFO):后插入行列的元素最先出行列,这种行列优先处理惩罚最近产生的事件;

  20.1 ArrayBlockingQueue

    ArrayBlockingQueue是一个有界线的阻塞行列,它的内部实现是一个数组,有界线意思就是它的容量是有限的,我们必需在其初始化的时候执行它的容量巨细,容量巨细一旦执行就不行改变;

    ArrayBlockingQueue是以先进先出的方法存储数据,最新插入的工具是尾部,最新移除的工具是头部;

public class ArrayBlockingQueueTest { public static void main(String[] args) throws InterruptedException { ArrayBlockingQueue<String> arrays=new ArrayBlockingQueue<String>(3); arrays.add("张三"); arrays.add("李四"); arrays.add("王五"); //添加阻塞行列 arrays.offer("赵六",1, TimeUnit.SECONDS); //poll要领相当于消费了行列中的数据,行列的数据就会删除 System.out.println(arrays.poll()); System.out.println(arrays.poll()); System.out.println(arrays.poll()); System.out.println(arrays.poll()); } }

      

21道并发编程面试题

    假如先出队一条数据,此时被阻塞的数据就可以添加进来

public class ArrayBlockingQueueTest { public static void main(String[] args) throws InterruptedException { ArrayBlockingQueue<String> arrays=new ArrayBlockingQueue<String>(3); arrays.add("张三"); arrays.add("李四"); arrays.add("王五"); System.out.println(arrays.poll()); //添加阻塞行列 arrays.offer("赵六",1, TimeUnit.SECONDS); //poll要领相当于消费了行列中的数据,行列的数据就会删除 System.out.println(arrays.poll()); System.out.println(arrays.poll()); System.out.println(arrays.poll()); } }

      

21道并发编程面试题

  20.2 LinkedBlockingQueue

    LinkedBlockingQueue阻塞行列巨细的设置时可选的,假如我们初始化时指定巨细,它就是有界线的,假如不指定,它就是无界线的。说是无界线,其实是回收了默认巨细为Integer.MAX_VALUE容量,它的内部是一个链表;

    和ArrayBlockingQueue一样,LinkedBlockingQueue也是以先进先出的方法存储数据,最新插入的工具是尾部,最新移除的工具是头部;

public class LinkedBlockingQueueTest { public static void main(String[] args) throws InterruptedException { LinkedBlockingQueue linkedBlockingQueue=new LinkedBlockingQueue(3); linkedBlockingQueue.add("A"); linkedBlockingQueue.add("B"); linkedBlockingQueue.add("C"); System.out.println(linkedBlockingQueue.poll()); System.out.println(linkedBlockingQueue.size()); } }

      

21道并发编程面试题

  20.3 PriorityBlockingQueue

    PriorityBlockingQueue是一个没有界线的行列,它的排序法则和java.util.PriorityQueue一样。需要留意,PriorityBlockingQueue中国答允插入null工具;

    所有插入PriorityBlockingQueue的工具必需实现java.lang.Comparable接口,行列优先级的排序法则就是凭据我们对这个接口的实现来界说的;

    别的,我们可以从PriorityBlockingQueue得到一个迭代器Iterator,但这个迭代器并不担保凭据优先级顺序举办迭代;

public class PriorityBlockingQueueTest { public static void main(String[] args) throws InterruptedException { PriorityBlockingQueue<String> priorityBlockingQueue=new PriorityBlockingQueue<String>(3); priorityBlockingQueue.add("AA"); priorityBlockingQueue.add("BB"); priorityBlockingQueue.add("CC"); System.out.println(priorityBlockingQueue.poll()); System.out.println(priorityBlockingQueue.size()); } }

      

21道并发编程面试题

  20.3 SynchronousQueue

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsdjff.html