首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java线程(三):线程协作-生产者消费者问题

上一篇讲述了线程的互斥(同步),但是在很多情况下,仅仅同步是不够的,还需要线程与线程协作(通信),生产者/消费者问题是一个经典的线程同步以及通信的案例。...该问题描述了两个共享固定大小缓冲区的线程,即所谓的“生产者”和“消费者”在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。...要解决该问题,就必须让生产者在缓冲区满时休眠(要么干脆就放弃数据),等到下次消费者消耗缓冲区中的数据的时候,生产者才能被唤醒,开始往缓冲区添加数据。...出现死锁时,两个线程都会陷入休眠,等待对方唤醒自己。该问题也能被推广到多个生产者和消费者的情形。...,此时就绪队列就一个A线程,马上执行,放入鸡蛋;如果再来A线程重复第一步,在来B线程重复第二步,整个过程就是生产者(A线程)生产鸡蛋,消费者(B线程)消费鸡蛋。

77300
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    线程之生产者消费者模式

    生产者消费者模式 前几篇复习了下《线程的创建方式》、《线程的状态》、《Thread 的源码解析》、《wait、notify/notifyAll 源码解析》这几篇文章。...Q1:那什么时候会唤醒阻塞线程? 1、当消费者判断队列为空时,消费者线程进入等待。这期间生产者一旦往队列中放入数据,就会通知所有的消费者,唤醒阻塞的消费者线程。...2、反之,当生产者判断队列已满,生产者线程进入等待。这期间消费者一旦消费了数据、队列有空位,就会通知所有的生产者,唤醒阻塞的生产者线程。 Q2:为什么要用这种模式? 看了上面的 Q1,大家发现没有?...因为我们的生产者和消费者线程都只有一个,但是多线程情况下用 if 就大错特错了。想象以下情况: 1、假设有两个消费者一个生产者。队列为空,消费者一进入等待状态,释放锁。...但其实背后 ArrayBlockingQueue 已经为我们做好了线程间通信的工作了,比如队列满了就去阻塞生产者线程,队列有空就去唤醒生产者线程等。

    95620

    线程同步之生产者消费者

    前言:   前面因时间关系,未将“生产者消费者问题”实例的介绍发布在博客随笔中,故本文作为对之前“多线程”一文的补充。...概念:   生产者消费者问题(Bounded-buffer problem),是一个多线程同步问题的经典案例。这个案例中主要实现的是两个角色协同对同一资源进行访问。...生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。...设计:本博客前面关于多线程的文章中已讲述过一个实例。本文的思路跟之前差不多,不过这次引入了一个存储资源的队列,并且需要设定2个用于信号传递的条件(Condition)。...其特点具有同步方法,也就是说套用阻塞队列,我们可以通过简化上面的代码同样实现生产者消费者的线程同步问题。

    22130

    多线程 生产者消费者模式

    多生产消费者模式 真正的开发环境下,不可能只有两条线程在跑,但是也有特殊情况,就是只需要两条线程来处理。 比如一个线程生产,一个线程消费。...这是一种线程协作,这种情场景下,生产者 和 消费者会操作同一个共享变量。...看到这里的小伙伴应该是对线程的基本用法有一定了解,这里就直接开始明确几个概念 生产者 生产数据的线程,比如产生订单 消费者 处理生产者产生的订单 实际环境中,生产数据的速度要大于消费的速度,...共享变量 会被多个线程共同访问的变量 生产者、消费者模式本质是,通过严格控制两个线程的交替执行,来实现一个生产、一个消费的模式,数据存储在共享变量中。...可以再扩展一下,比如常用的MQ,也是一种生产者消费者模式,Producer 生产消费,Consumer消费消息。

    25930

    多线程中的生产者消费者问题 - 线程的同步

    同步问题的提出 操作系统中的生产者消费者问题,就是一个经典的同步问题。举一个例子,有两个人,一个人在刷盘子,另一个人在烘干。...这个示例要说明的问题是,生产者生产一个产品后就放入共享对象中,而不管共享对象中是否有产品。消费者从共享对象中取用产品,但不检测是否已经取过。...若共享对象中只能存放一个数据,可能出现以下问题(线程不同步的情况下): 生产者比消费者快时,消费者会漏掉一些数据没有取到。 消费者比生产者快时,消费者取相同的数据。...解决方法 为了解决线程运行速度问题,Java提供了一种建立在对象实例之上的交互方法。Java中的每个对象实例都有两个线程队列和他相连。第一个用来排列等待锁定标志的线程。...在调用一个对象的wait(),notify()/notifyAll()时,必须首先持有该对象的锁定标志,因此这些方法必须在同步程序块中调用。

    51820

    Linux多线程【生产者消费者模型】

    阻塞队列 和 环形队列 超市不可能只面向一个顾客及一个工厂,「交易场所」 也是如此,会被多个 生产者消费者(多个线程) 看到,也就是说 「交易场所」 注定是一个共享资源;在多线程环境中,需要保证 共享资源被多线程并发访问时的安全...生产者与消费者间的同步关系 生产者不断生产,交易场所堆满商品后,需要通知消费者进行消费 消费者不断消费,交易场所为空时,需要通知生产者进行生产 通知线程需要用到条件变量,即维护 同步 关系...信号量」,再串行化访问临界资源 接下来增加 生产者、消费者 的线程数量,并进行测试 修改 cp.cc // ......、数据消费次数,并且由于数据获取、消费操作没有加锁,支持并发,因此效率十分高 环形队列 中允许 N 个生产者线程一起进行数据获取,也允许 N 个消费者线程一起进行数据消费,简单任务处理感知不明显,但复杂任务就不一样了...多线程编程中,最重要的是确保线程安全问题,而 「生产者消费者模型」 在确保线程安全的同时提高了并发操作的效率,值得学习和使用 相关文章推荐 Linux多线程 =====:> 【

    56730

    【Linux线程】Linux多线程实践:深入生产者消费者模型

    而在多线程编程中,生产者消费者模型无疑是一个经典且重要的并发编程模式 生产者消费者模型描述了一个或多个生产者线程生成数据,并将其放入缓冲区,同时一个或多个消费者线程从缓冲区中取出数据进行处理的过程。...我们将从模型的基本概念出发,逐步深入到Linux多线程编程的实战技巧。通过详细的代码示例和深入的解析,我们将帮助读者掌握如何在Linux多线程环境下实现高效且稳定的生产者消费者模型 1....生产者消费者模型 生产者消费者模型(Producer-Consumer Model)是一种经典的并发编程模式,它描述了两个或多个线程之间的协作关系:生产者线程负责生成数据并将其放入缓冲区,而消费者线程则从缓冲区中取出数据进行处理...基于BlockingQueue的生产者消费者模型 在多线程编程中阻塞队列(Blocking Queue)是一种常用于实现生产者和消费者模型的数据结构。...从模型的基本概念出发,我们逐步掌握了线程同步机制、以及并发问题处理等关键知识点 在生产者消费者模型的实现过程中,我们深刻体会到了Linux多线程编程的复杂性和挑战性。

    14410

    java多线程-消费者和生产者模式

    /* * 多线程-消费者和生产者模式 * 在实现消费者生产者模式的时候必须要具备两个前提,一是,必须访问的是一个共享资源,二是必须要有线程锁,且锁的是同一个对象 * */ 1 /*资源类中定义了...name(名字):用来区分消费者还是生产者 2 * 定义了flag标记:用来区分有没有货物(默认生产一个就要消费一个) 3 * 定义了count(生产的个数统计)...并将flag标记改变*/ 11 public synchronized void set(String name){ 12 //判断是否有产品,这里用while循环,避免在多个生产者同时生产时...main(String[] args) { 67 //初始化唯一的资源 68 TestSource ts=new TestSource(); 69 //创建生产者和消费者两个对象...while(flag){ 14 try { 15 //wait(); 16 //调用生产者控制方法

    81620

    Java多线程08——生产者消费者模式

    1 概念介绍 多线程环境下,我们经常需要多个线程的并发和相互通信。其中,有一个重要的多线程并发协作模型,即“生产者/消费者模式”。...2 角色介绍 生产者 负责生产数据的模块,可以是方法、对象、线程或进程。 消费者 负责处理数据的模块,可以是方法、对象、线程或进程。...缓冲区是实现并发的核心,设置缓冲区的优点: 实现线程的并发协作 设置缓冲区后,生产者线程只需要向缓冲区里面放入数据,而不需要去查看消费者消费的情况;同样,消费者只需要从缓冲区取走要处理的数据即可,也不需要查看生产者生产的情况...这样,就从逻辑上实现了“生产者线程”和“消费者线程”的分离,解除了生产者与消费者之间的耦合。...new ConsumerThread(block).start(); //启动生产者线程 new ProducerThread(block).start

    21820

    玩转Kafka的生产者——分区器与多线程

    其中包括生产者和消费者, 多线程生产者,多线程消费者,自定义分区等,当然还包括一些避坑指南。  ...线程池生产者 在实际生产过程中,通常消息数量是比较多的,就可以考虑使用线程池。...使用线程池发送消息时,要考虑两点:1.需要结合实际情况,合理设计线程池的大小;2.使用线程池时,消息的发送是无序的,如果对消息的顺序有要求,不建议使用。...org.apache.kafka.clients.producer.ProducerRecord; /** * 生产者线程 */ public class ProducerThread implements...,这里还是有一些遐思,就是没有自定义,线程创建工厂,没有指定创建的线程名称,在实际生产中,最好是自定义线程工厂。

    1.7K30

    多线程模拟实现生产者/消费者模型 (借鉴)

    在生产者/消费者模型中,生产者Producer负责生产数据,而消费者Consumer负责使用数据。多个生产者线程会在同一时间运行,生产数据,并放到内存中一个共享的区域。...期间,多个消费者线程读取内存共享区,消费里面的数据。...分析 在下面Java应用程序中,生产者线程向一个线程安全的堆栈缓冲区中写(PUSH)数据,消费者从该堆栈缓冲区中读(POP)数据,这样,这个程序中同时运行的两个线程共享同一个堆栈缓冲区资源。...类Producer是生产者模型,其中的run方法中定义了生产者线程所做的操作,循环调用push()方法,将生产的100个字母送入堆栈中,每次执行完push操作后,调用sleep方法睡眠一段随机时间。...} } 生产者Product package com.ailk.biapp.ci.ProducerAndConsumer; public class Producer implements

    80630
    领券