Java特性队列和栈的堵塞原理解析

 更新时间:2020年10月19日 16:23:07   作者:cuisuqiang  
这篇文章主要介绍了Java特性队列和栈的堵塞原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

做消息通信,消息会不断从网络流中取得,而后台也有线程不断消费。本来我一直是使用一些线程安全标识或方法来控制,后来在网上找到一些java新特性,里面包含了可以用到的堆栈使用,而且是堵塞的,这样至少可以保证一些安全性。

对于堆:

BlockingQueue 不接受 null 元素。试图 add、put 或 offer 一个 null 元素时,某些实现会抛出 NullPointerException。null 被用作指示 poll 操作失败的警戒值。

BlockingQueue 可以是限定容量的。它在任意给定时间都可以有一个 remainingCapacity,超出此容量,便无法无阻塞地 put 附加元素。没有任何内部容量约束的 BlockingQueue 总是报告 Integer.MAX_VALUE 的剩余容量。

BlockingQueue 实现主要用于生产者-使用者队列,但它另外还支持 Collection接口。因此,举例来说,使用 remove(x) 从队列中移除任意一个元素是有可能的。然而,这种操作通常不 会有效执行,只能有计划地偶尔使用,比如在取消排队信息时。

BlockingQueue 实现是线程安全的。所有排队方法都可以使用内部锁或其他形式的并发控制来自动达到它们的目的。然而,大量的 Collection 操作(addAll、containsAll、retainAll 和 removeAll)没有 必要自动执行,除非在实现中特别说明。因此,举例来说,在只添加了 c 中的一些元素后,addAll(c) 有可能失败(抛出一个异常)。

看一段代码:

package com.test; 
import java.util.concurrent.ArrayBlockingQueue; 
import java.util.concurrent.BlockingQueue; 
/** 
 * @说明 堵塞队列和栈的使用 
 */ 
public class Test { 
  @SuppressWarnings("unchecked") 
  public static void main(String[] args) throws InterruptedException { 
    BlockingQueue bqueue = new ArrayBlockingQueue(5); 
    for (int i = 0; i < 10; i++) { 
      // 添加元素到队列,如果没有可用空间,将一直等待(如果有必要) 
      bqueue.put(i); 
      System.out.println("添加了元素:" + i); 
    } 
    System.out.println("----End----"); 
  } 
}

运行效果:

添加了元素:0
添加了元素:1
添加了元素:2
添加了元素:3
添加了元素:4

之后就会一直等待。

对于栈:

BlockingDeque 方法有四种形式,使用不同的方式处理无法立即满足但在将来某一时刻可能满足的操作:第一种方式抛出异常;第二种返回一个特殊值(null 或 false,具体取决于操作);第三种无限期阻塞当前线程,直至操作成功;第四种只阻塞给定的最大时间,然后放弃。

看一个例子:

package com.test; 
import java.util.concurrent.BlockingDeque; 
import java.util.concurrent.LinkedBlockingDeque; 
/** 
 * @说明 堵塞队列和栈的使用 
 */ 
public class Test { 
  @SuppressWarnings("unchecked") 
  public static void main(String[] args) throws InterruptedException { 
    BlockingDeque bDeque = new LinkedBlockingDeque(5); 
    for (int i = 0; i < 10; i++) { 
      // 将指定元素添加到此阻塞栈中,如果没有可用空间,将一直等待(如果有必要)。 
      bDeque.putFirst(i); 
      System.out.println("添加了元素:" + i); 
    } 
    System.out.println("----End----"); 
  } 
} 

运行结果和堆一样,也会产生等待。

对于两者的解释:

阻塞队列的概念是,一个指定长度的队列,如果队列满了,添加新元素的操作会被阻塞等待,直到有空位为止。同样,当队列为空时候,请求队列元素的操作同样会阻塞等待,直到有可用元素为止。

对于阻塞栈,与阻塞队列相似。不同点在于栈是“后入先出”的结构,每次操作的是栈顶,而队列是“先进先出”的结构,每次操作的是队列头。

注意的是,BlockingQueue是5中的特性,jdk6以后才增加了BlockingDeque。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 利用Java的MyBatis框架获取MySQL中插入记录时的自增主键

    利用Java的MyBatis框架获取MySQL中插入记录时的自增主键

    这篇文章主要介绍了利用Java的MyBatis框架获取MySQL中插入记录的自增长字段值,其中大家可以看到MyBatis支持普通SQL语句所带来的遍历,需要的朋友可以参考下
    2016-06-06
  • java版十大排序经典算法:完整代码(4)

    java版十大排序经典算法:完整代码(4)

    优秀的文章也不少,但是Java完整版的好像不多,我把所有的写一遍巩固下,同时也真诚的希望阅读到这篇文章的小伙伴们可以自己去从头敲一遍,不要粘贴复制!希望我的文章对你有所帮助,每天进步一点点
    2021-07-07
  • 关于BeanUtils.copyProperties(source, target)的使用

    关于BeanUtils.copyProperties(source, target)的使用

    这篇文章主要介绍了关于BeanUtils.copyProperties(source, target)的使用说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • SpringMVC+MyBatis分页(最新)

    SpringMVC+MyBatis分页(最新)

    本篇文章主要介绍了SpringMVC+MyBatis分页,具有一定的参考价值,有兴趣的可以了解一下。
    2016-12-12
  • 解决DataOutputStream乱码的问题

    解决DataOutputStream乱码的问题

    这篇文章主要介绍了DataOutputStream乱码问题的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • springboot v2.0.3版本多数据源配置方法

    springboot v2.0.3版本多数据源配置方法

    这篇文章主要介绍了springboot v2.0.3版本多数据源配置方法,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2018-11-11
  • 一个处理用户登陆的servlet简单实例

    一个处理用户登陆的servlet简单实例

    这篇文章主要介绍了一个处理用户登陆的servlet简单实例,可通过servlet实现处理用户登录的功能,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-01-01
  • Opencv创建车牌图片识别系统方法详解

    Opencv创建车牌图片识别系统方法详解

    本文主要介绍了一个基于spring boot+maven+opencv实现的图像识别及训练项目,可以实现车牌识别功能,感兴趣的可以跟随小编一起试一试
    2022-01-01
  • 基于Spring Boot应用ApplicationEvent案例场景

    基于Spring Boot应用ApplicationEvent案例场景

    这篇文章主要介绍了基于Spring Boot应用ApplicationEvent,利用Spring的机制发布ApplicationEvent和监听ApplicationEvent,需要的朋友可以参考下
    2023-03-03
  • zuul转发后服务取不到请求路径的解决

    zuul转发后服务取不到请求路径的解决

    这篇文章主要介绍了zuul转发后服务取不到请求路径的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07

最新评论