欢迎光临
我们一直在努力

利用阻塞队列实现生产者消费者模式

说道Java23中设计模式中的生产者消费者模式就不得不说一下它的优点

  • 它简化的开发,你可以独立地或并发的编写消费者和生产者,它仅仅只需知道共享对象是谁
  • 生产者不需要知道谁是消费者或者有多少消费者,对消费者来说也是一样
  • 生产者和消费者可以以不同的速度执行
  •  分离的消费者和生产者在功能上能写出更简洁、可读、易维护的代码

在日常工作中也会经常用到,那么其实现的方式也有多种,本篇就以BlockingQueue实现生产者消费者模式。BlockingQueue 一个接口,其实现类有四个:

  • ArrayBlockingQueue:规定大小的BlockingQueue,其构造函数必须带一个int参数来指明其大小.其所含的对象是以FIFO(先入先出)顺序排序的.
  • LinkedBlockingQueue:大小不定的BlockingQueue,若其构造函数带一个规定大小的参数,生成的BlockingQueue有大小限制,若不带大小参数,所生成的BlockingQueue的大小由Integer.MAX_VALUE来决定.其所含的对象是以FIFO(先入先出)顺序排序的
  • PriorityBlockingQueue:类似于LinkedBlockQueue,但其所含对象的排序不是FIFO,而是依据对象的自然排序顺序或者是构造函数的Comparator决定的顺序.
  • SynchronousQueue:特殊的BlockingQueue,对其的操作必须是放和取交替完成的.

常用方法有:

  • add(anObject):把anObject加到BlockingQueue里,即如果BlockingQueue可以容纳,则返回true,否则报异常
  • offer(anObject):表示如果可能的话,将anObject加到BlockingQueue里,即如果BlockingQueue可以容纳,则返回true,否则返回false.
  • put(anObject):把anObject加到BlockingQueue里,如果BlockQueue没有空间,则调用此方法的线程被阻断直到BlockingQueue里面有空间再继续.
  • poll(time):取走BlockingQueue里排在首位的对象,若不能立即取出,则可以等time参数规定的时间,取不到时返回null
  • take():取走BlockingQueue里排在首位的对象,若BlockingQueue为空,阻断进入等待状态直到Blocking有新的对象被加入为止

实现代码:

运行结果:

你可以看到生产者线程生产数和消费者线程消费它以FIFO的顺序,因为阻塞队列只允许元素以FIFO的方式来访问。

未经允许不得转载:李阳博客 » 利用阻塞队列实现生产者消费者模式

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址