美文网首页
Java之消息队列

Java之消息队列

作者: 如果仲有听日 | 来源:发表于2018-09-26 15:55 被阅读0次

BlockingQueue

    ArrayBlockingQueue

    LinkedBlockingQueue


线程间通信的方式:

    公共变量共享

    消息队列

线程同步:

    synchronized和Lock

    消息队列

1. BlockingQueue接口

是一种线程间通信方法

1.1. 接口主要方法

put、take一对阻塞存取;add、poll一对非阻塞存取

插入方法:

    1. boolean add(E e): 把一个Object加到BlockingQueue里,如果BlockingQueue可以容纳,则返回true,否则抛出IllegalStateException

    2. boolean offer(E e): 如果可能的话,将一个Object加到BlockingQueue,如果BlockingQueue可以容纳,则返回true,否则返回false

    3. void put(E e): 把一个object加到BlockingQueue里,如果BlockingQueue没有空间,则调用此方法的线程被阻塞,知道BlockingQueue里面有空间再继续。

读取:

    1. E poll(long timeout, TimeUnit unit): 取走BlockingQueue里排在首位的对象,若不能立即取出,则可以等time参数规定的时间,取不到时返回null

    2. E take(): 取走BlockingQueue里排在首位的对象,若BlockingQueue为空,阻断进入等待状态直到BlockingQueue有新的对象加入为止

其他:

    1. int remainingCapacity(): 返回队列剩余的容量,在队列插入和获取的时候,数据不准确

    2. boolean remove(Object o): 从对移除元素,如果存在,即移除一个或者更多,队列改变了返回true

    3. boolean contains(object o): 如果此队列包含指定的元素,则返回true

    4. int drainTo(Collection<? super E> c): 移除此队列中所有可用的元素,并将它们添加到给定collection中。

    5. int drainTo(Collection<? super E> c, int maxElements); 和4方法区别在于,指定了移动的数量。

1.2. BlockingQueue实现类

主要有两个常用的实现类:

    1. ArrayBlockingQueue:一个有数组支持的有界阻塞队列,规定大小的BlockingQueue,其结构函数必须带一个int参数来指明其大小,其所含的对象是以FIFO顺序排列的

    2. LinkedBlockingQueue:大小不定的BlockingQueue,若其构造函数带一个规定大小的参数,生成的BlockingQueue有大小限制,若不带大小参数,所生成的BlockingQueue的大小由Integer.MAX_VALUE来决定。其所含的对象是以FIFO顺序排序的。 其中主要用到put()和take()阻塞方法。

2. 测试BlockingQueue

测试代码可以制造一个生产者和一个消费者,用主程序控制。

生产者启动多个线程,每个线程调用构造函数传递BlockingQueue 对象,往queue中写入县城名字

消费者线程调用构造函数传递同样的queue,阻塞读取queue中的生产者线程写入的线程名

代码略

3. JMS

JMS:Java Message Service

不同主机或者进程间的通信机制

3.1. 什么是JMS

3.2. JMS体系架构

3.3. Java消息服务应用程序结构的两种模型

3.3.1. 点对点或队列模型

3.3.2. 发布者/订阅者模型

3.3.3. 常见的JMS三方提供者

相关文章

网友评论

      本文标题:Java之消息队列

      本文链接:https://www.haomeiwen.com/subject/cfwdoftx.html