`
逆风的香1314
  • 浏览: 1431590 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java线程间同步实现生产者-消费者模式

阅读更多
   1.生产者-消费者模式实现概述
  生产者与消费者模式是我们在编程过程中经常会遇到的,就像我们生活那样,生产者生产出产品,消费者去购买产品。在这里我们创建三个线程,一个主控线程main,用于创建各辅助线程;一个生产者线程,用于生产产品;一个消费者线程,用于购买产品。另外,我们创建一个队列类Queue,生产线程生产的产品将放置到该队列中,然后消费者线程在该队列中取走产品。
  2.实现该模式的要点:
  首先必须让生产者线程与消费者线程达到同步,也就是说,当生产者线程生产出产品后,消费者才能去取,依此轮回。当生产者线程放置产品到队列中时,队列要检查队列是否已满,如已满,则等待消费者线程将产品取走,否则放置产品到队列中。当消费者线程在队列中取产品时,队列也要检查队列是否为空,如果为空,则等待生产者线程放置产品到队列,否则在队列中取走产品。
  3.源代码:
  class MainThread
  {
  public static void main(String[] args)
  {
  Queue queue=new Queue();
  Producer producer=new Producer(queue);
  Consumer consumer=new Consumer(queue);
  new Thread(producer).start();
  new Thread(consumer).start();
  }
  }
  /*注意:wait notify notifyAll只能在同步方法或内步块中调用*/
  class Queue
  {
  int product=0;
  boolean bfull=false;
  public synchronized void setProduct(int product)
  {
  if(bfull)//如果队列已满,则调用wait等待消费者取走产品
  {
  try
  {
  wait();
  }
  catch(Exception e)
  {
  e.printStackTrace();
  }
  }
  /*开始放置产品到队列中*/
  this.product=product;
  System.out.println("Producer set product:"+product);
  bfull=true;
  notify();//生产产品后通知消费者取走产品
  }
  public synchronized void getProduct()
  {
  if(!bfull)//如果队列是空的,则调用wait等待生产者生产产品
  {
  try
  {
  wait();
  }
  catch(Exception e)
  {
  e.printStackTrace();
  }
  }
  /*开始从队列取走产品*/
  System.out.println("Consumer get product:"+product);
  bfull=false;
  notify();//取走产品后通知生产者继续生产产品
  }
  }
  class Producer implements Runnable
  {
  Queue queue;
  Producer(Queue queue)
  {
  this.queue=queue;
  }
  public void run()//生产线程
  {
  for(int i=1;i<=10;i++)
  {
  queue.setProduct(i);
  }
  }
  }
  class Consumer implements Runnable
  {
  Queue queue;
  Consumer(Queue queue)
  {
  this.queue=queue;
  }
  public void run()//消费线程
  {
  for(int i=1;i<=10;i++)
  {
  queue.getProduct();
  }
  }
  }
  输出结果如下:
  Producer set product:1
  Consumer get product:1
  Producer set product:2
  Consumer get product:2
  Producer set product:3
  Consumer get product:3
  Producer set product:4
  Consumer get product:4
  Producer set product:5
  Consumer get product:5
  Producer set product:6
  Consumer get product:6
  Producer set product:7
  Consumer get product:7
  Producer set product:8
  Consumer get product:8
  Producer set product:9
  Consumer get product:9
  Producer set product:10
  Consumer get product:10
分享到:
评论
1 楼 phk070832 2011-02-25  
为什么你的代码每次都要先设置一个产品,然后才能取出一个产品,而不能做到让的设置产品和取出产品的2个操作相互独立。

相关推荐

    JAVA实现线程间同步与互斥生产者消费者问题

    在`JThreadSynch`这个压缩包文件中,我们可以预见到包含的Java源代码将展示以上的一种或多种机制,通过具体的示例代码来解释和实现生产者消费者问题的线程同步和互斥。通过学习和理解这个示例,开发者可以更好地掌握...

    java多线程实现生产者和消费者

    在并发编程中,"生产者-消费者"模式是一种经典的解决问题的范式,用于协调两个或更多线程间的协作,其中一部分线程(生产者)生成数据,另一部分线程(消费者)消费这些数据。 生产者-消费者模型的核心在于共享资源...

    Java多线程实现生产者消费者

    这就是一个基本的Java“生产者-消费者”模型实现。通过这样的设计,我们可以有效地控制生产者和消费者的执行顺序,确保了数据的正确性,并且避免了先消费后生产的情况。在实际应用中,可能需要根据具体需求进行优化...

    用多线程同步方法解决生产者-消费者问题

    总的来说,解决生产者-消费者问题需要深入理解线程同步原理,并结合具体的需求进行设计和实现。这个过程不仅锻炼了编程能力,也对并发编程的理解有着重要的实践意义。在实际项目中,这样的并发控制技术广泛应用在...

    Java线程间的通信----生产者消费者模型

    生产者消费者模型是一种经典的线程同步问题,它模拟了实际生活中的生产过程和消费过程,使得生产者线程可以将数据生产出来,而消费者线程则负责消耗这些数据,两者之间通过共享数据结构进行协同工作。 生产者消费者...

    Java多线程 生产者-消费者模式

    总之,Java中的生产者-消费者模式是多线程编程中解决数据共享和同步问题的有效手段,通过合理利用`BlockingQueue`等并发工具类,我们可以构建高效、稳定的多线程应用。在开发过程中,了解和掌握这种模式有助于提高...

    多线程简易实现生产者消费者模式

    生产者消费者模式是一种经典的多线程同步问题解决方案,它源于现实世界中的生产流水线,用于描述生产者(Producer)和消费者(Consumer)之间的协作关系。在这个模式中,生产者负责生成产品并放入仓库,而消费者则从...

    基于JAVA线程机制研究生产者-消费者问题.pdf

    总之,基于Java线程机制研究生产者-消费者问题,通过实际编码演示了线程创建和管理、线程同步机制的应用,以及如何使用Java提供的数据结构来解决实际问题。这项研究不仅具有理论意义,更具有指导学生实践的意义,...

    编程模拟实现生产者-消费者进程

    ### 编程模拟实现生产者-消费者进程 #### 生产者-消费者问题概述 生产者-消费者问题是操作系统中进程间通信的经典案例之一。该问题主要描述了一组生产者进程不断生成数据并将其放置在一个共享缓冲区中,而一组消费...

    生产者-消费者多线程处理

    在Java中,可以使用`BlockingQueue`接口来实现生产者-消费者模式,它已经内置了线程安全的队列操作。生产者可以使用`offer()`方法添加元素,消费者则用`take()`方法取出元素,这两个方法会自动处理等待和唤醒操作。 ...

    基于JAVA线程机制研究生产者-消费者问题.zip

    在Java编程中,线程是并发执行的基本单元,它允许程序在同一时间处理多个任务。生产者-消费者问题是多线程编程中的...生产者-消费者问题的解决方式不仅有助于提升程序的并发能力,还能够加深对Java线程同步机制的理解。

    多线程间通信:多生产者-多消费者实例

    本文将深入探讨“多生产者-多消费者”模式,这是一种经典的线程同步问题,旨在优化资源的利用和提高系统的效率。在这个模式中,多个生产者线程生成数据,而多个消费者线程则负责消费这些数据。为了确保数据的一致性...

    用多线程同步方法解决生产者-消费者问题操作系统课设.doc

    【标题与描述】所涉及的知识点是“生产者-消费者问题”,这是一个经典的多线程同步问题,常见于操作系统课程设计中。在这个问题中,生产者线程负责生成数据,而消费者线程则负责消费这些数据。多线程同步是解决这类...

    JAVA_生产者-消费者

    总结来说,"JAVA_生产者-消费者"是一个经典的并发编程模型,它利用Java的线程同步机制和`BlockingQueue`接口来实现高效的数据交换。理解并熟练掌握这一模式对于开发高并发、高性能的Java应用至关重要。通过学习和...

    多线程_生产者与消费者模式示例

    生产者与消费者模式是设计模式中的经典范例,它有效地展示了线程间的协作和同步。这个模式主要解决的问题是数据的生产和消费过程中的等待与协作问题。 在多线程环境下,生产者负责生成数据,而消费者则负责处理这些...

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

    在Java编程中,"线程同步--生产者消费者问题"是一个经典的多线程问题,它涉及到如何有效地在多个线程之间共享资源。这个问题通常用于演示和理解线程间的协作机制,如互斥锁、条件变量等。在此,我们将深入探讨这个...

    JAVA课程设计(生产者-消费者问题)

    总结来说,这个JAVA课程设计旨在通过生产者-消费者问题,让学生掌握Java多线程编程,理解线程同步与通信的重要性,以及如何在实际场景中运用这些概念,提高并发编程能力。通过这个项目,学生可以学习到如何设计并...

    模拟“生产者-消费者”解决过程及方法

    "生产者-消费者"问题是一种经典的多线程同步问题,源于计算机科学中的操作系统领域,用于描述在并发环境中如何协调生产者和消费者之间的操作,确保数据的一致性和避免资源浪费。这个问题的基本设定是有一个共享缓冲...

    编程实现进程(线程)同步和互斥

    在Windows等操作系统下,使用的VC、VB、java或C等编程语言,采用进程(线程)同步和互斥的技术编写程序实现生产者-消费者问题或哲学家进餐问题或读者-写者问题或自己设计一个简单进程(线程)同步和互斥的实际问题。

Global site tag (gtag.js) - Google Analytics