当前位置:网站首页 > Java基础 > 正文

java阻塞队列实现生产者消费者(java实现一个阻塞队列)



利用多线程和队列可以实现生产者消费者模式。该模式通过平衡生产线程和消费线程的工作能力来提高程序整体处理数据的速度。

什么是生产者和消费者?

在线程世界里,生产者就是生产数据(或者说发布任务)的线程,消费者就是消费数据(或者说处理任务)的线程。在任务执行过程中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据。同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者提供更多的任务,本质上,这是一种供需不平衡的表现。为了解决这个问题,我们创造了生产者和消费者模式。

生产者消费者模式的工作机制:

生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而是通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不直接找生产者要数据,而是从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力,解耦了生产者和消费者。

生产者消费者模式的优点

    举个例子,我们去邮局投递信件,如果不使用邮箱(也就是缓冲区),你必须得把信直接交给邮递员。有同学会说,直接给邮递员不是挺简单的嘛?其实不简单,你必须 得认识谁是邮递员,才能把信给他。这就产生了你和邮递员之间的依赖(相当于生产者和消费者的强耦合)。万一哪天邮递员 换人了,你还要重新认识一下(相当于消费者变化导致修改生产者代码)。而邮箱相对来说比较固定,你依赖它的成本就比较低(相当于和缓冲区之间的弱耦合)。
      继续上面的例子,如果我们不使用邮箱,就得在邮局等邮递员,直到他回来,把信件交给他,这期间我们啥事儿都不能干(也就是生产者阻塞)。或者邮递员得挨家挨户问,谁要寄信(相当于消费者轮询)。

        生产者消费者模式的核心是‘阻塞队列’也称消息队列。在生产环境中有很多大名鼎鼎的分布式消息队列,例如RabbitMQ,RocketMq,Kafka等等。在学习过程中,我们没必要使用这么大型的队列,直接使用Python内置的queue模块中提供的队列就可以了。

        代码举例

        运行结果:

        Producer is producing 0 to the queue! Consumer is consuming. 0 in the queue is consumed! Producer is producing 1 to the queue! Producer is producing 2 to the queue! Producer is producing 3 to the queue! Consumer is consuming. 1 in the queue is consumed! Producer is producing 4 to the queue! Consumer is consuming. 2 in the queue is consumed! Producer is producing 5 to the queue! Consumer is consuming. 3 in the queue is consumed! Producer is producing 6 to the queue! Consumer is consuming. 4 in the queue is consumed! Producer is producing 7 to the queue! Consumer is consuming. 5 in the queue is consumed! Producer is producing 8 to the queue! Consumer is consuming. 6 in the queue is consumed! Producer is producing 9 to the queue! Producer finished!

        补充说明:

        Python中的Queue模块已经提供了对线程同步的支持,所以本文并没有涉及锁、同步、死锁等多线程问题。

        到此这篇java阻塞队列实现生产者消费者(java实现一个阻塞队列)的文章就介绍到这了,更多相关内容请继续浏览下面的相关 推荐文章,希望大家都能在编程的领域有一番成就!

        版权声明


        相关文章:

      • 字符串转编码格式(字符串转编码格式java)2025-09-04 11:54:09
      • 字符串转int java(字符串转interger)2025-09-04 11:54:09
      • java课程网站(java课程 在线)2025-09-04 11:54:09
      • Java字符串转int(Java字符串转数组)2025-09-04 11:54:09
      • JAVA中字符串转date(JAVA中字符串转成set方法)2025-09-04 11:54:09
      • java中字符串转为字符数组(java中字符串转换为字符数组)2025-09-04 11:54:09
      • java阻塞队列和非阻塞队列的区别(阻塞队列java实现)2025-09-04 11:54:09
      • java程序网站(java写的网站)2025-09-04 11:54:09
      • java中将一个字符串转换成int类型的整数(java中将字符串转化为整型)2025-09-04 11:54:09
      • java字符串类型转换为int(java字符串转其他类型)2025-09-04 11:54:09
      • 全屏图片