你的位置:首页 > 软件开发 > Java > java并发:阻塞队列

java并发:阻塞队列

发布时间:2016-04-15 13:00:05
第一节 阻塞队列1.1 初识阻塞队列  队列以一种先进先出的方式管理数据,阻塞队列(BlockingQueue)是一个支持两个附加操作的队列,这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空;当队列满时,存储元素的线程会等待队列可用。在多线程进行合作时,阻塞队列 ...

java并发:阻塞队列

第一节 阻塞队列

1.1 初识阻塞队列

  队列以一种先进先出的方式管理数据,阻塞队列(BlockingQueue)是一个支持两个附加操作的队列,这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空;当队列满时,存储元素的线程会等待队列可用。在多线程进行合作时,阻塞队列是很有用的工具。

  生产者-消费者模式:阻塞队列常用于生产者和消费者的场景,生产者线程可以定期的把中间结果存到阻塞队列中,而消费者线程把中间结果取出并在将来修改它们。队列会自动平衡负载,如果生产者线程集运行的比消费者线程集慢,则消费者线程集在等待结果时就会阻塞;如果生产者线程集运行的快,那么它将等待消费者线程集赶上来。

    java并发:阻塞队列

  简单解说一下如何理解上表,比如说阻塞队列的插入方法,add(e)、offer(e)、put(e)等均为阻塞队列的插入方法,但它们的处理方式不一样,add(e)方法可能会抛出异常,而put(e)方法则可能一直处于阻塞状态,下面解说一下这些处理方式:

  A、抛出异常:所谓抛出异常是指当阻塞队列满时,再往队列里插入元素,会抛出IllegalStateException("Queue full")异常;当队列为空时,从队列里获取元素时会抛出NoSuchElementException异常 。

  B、返回特殊值:插入方法,该方**返回是否成功,成功则返回true;移除方法,该方法是从队列里拿出一个元素,如果没有则返回null

  C、一直阻塞:当阻塞队列满时,如果生产者线程往队列里put元素,队列会一直阻塞生产者线程,直到将数据放入队列或是响应中断退出;当队列为空时,消费者线程试图从队列里take元素,队列也会一直阻塞消费者线程,直到队列可用。

  D、超时退出:当阻塞队列满时,队列会阻塞生产者线程一段时间,如果超过一定的时间,生产者线程就会退出。

 

1.2 Java中的阻塞队列

  java.util.concurrent包提供了几种不同形式的阻塞队列,如数组阻塞队列ArrayBlockingQueue、链表阻塞队列LinkedBlockingQueue、优先级阻塞队列PriorityBlockingQueue和延时队列DelayQueue等,下面简单介绍一下这几个阻塞队列:

  数组阻塞队列:ArrayBlockingQueue是一个由数组支持的有界阻塞队列,内部维持着一个定长的数据缓冲队列(该队列由数组构成),此队列按照先进先出(FIFO)的原则对元素进行排序,在构造时需要给定容量。ArrayBlockingQueue内部还保存着两个整形变量,分别标识着队列的头部和尾部在数组中的位置。

  对于数组阻塞队列,可以选择是否需要公平性,所谓公平访问队列是指阻塞的所有生产者线程或消费者线程,当队列可用时,可以按照阻塞的先后顺序访问队列,即先阻塞的生产者线程,可以先往队列里插入元素,先阻塞的消费者线程,可以先从队列里获取元素。通常,公平性会使你在性能上付出代价,只有在的确非常需要的时候再使用它。

  我们可以使用以下代码创建一个公平的阻塞队列:

ArrayBlockingQueue fairQueue = new ArrayBlockingQueue(1000,true);

 

海外公司注册、海外银行开户、跨境平台代入驻、VAT、EPR等知识和在线办理:https://www.xlkjsw.com

原标题:java并发:阻塞队列

关键词:JAVA

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。