java多线程 生产者 消费者 问题 。。。

 

/*
每一个对象除了有一个锁之外,还有一个等待队列(wait set),当一个对象刚创建的时候,它的对待队列是空的。
我们应该在当前线程锁住对象的锁后,去调用该对象的wait方法。

也就是在同步快 或者同步函数中调用  wait  对于生产者消费者问题应该在同一个对象的等待队列中

当调用对象的notify方法时,将从该对象的等待队列中删除一个任意选择的线程,这个线程将再次成为可运行的线程。
当调用对象的notifyAll方法时,将从该对象的等待队列中删除所有等待的线程,这些线程将成为可运行的线程。
wait和notify主要用于producer-consumer这种关系中。

 

下面模拟 生产者 消费者问题
*/

class  Test 
{
 
 public static void main(String []args)
 {
  Queue q=new Queue();  //创建一个队列
  Procedure p=new Procedure(q); //生产者线程
  Consumer c=new Consumer(q);//消费者线程
  p.start();  //启动
  c.start();//run
 }
}

class  Procedure  extends Thread
{
 Queue q;
 Procedure(Queue q)  //带参数构造函数
 {
  this.q=q;
 }
 public  void run()
 {
  for(int i=0;i<100;i++)
  {
   q.put(i);  //向队列放数据
   System.out.println("Producer put "+i);  //显示队列数据
  }
  
  
 }

}

class  Consumer  extends Thread
{
 Queue q;
 Consumer(Queue q)
 {
  this.q=q;  //构造函数
 }
 public  void run() 
 {
  while(true)
  {
   int n=q.get();  //从队列获取 数据
   try
      {
        Thread.sleep(10);  //线程等待一下
      }
  catch(Exception e)
   {
    
   }
   System.out.println("Consumer get"+ n);
  }
  
 }

}

class  Queue //面向对象的思想 用类封装数据
{
 int i ;// 队列数据
 boolean bFull=false;
 public synchronized  int  get()   //同步方法
 {
  if(bFull==false)
  { try
   {
    wait() ;// 使消费者线程等待  wait方法会跑出异常 使当前线程进入 this对象的等待序列 
    }
    catch(Exception e)
    {
     e.printStackTrace();
    }
  }
  bFull=false;  //如果有食物的话 设置食物为空 并且从this等待队列删除 线程
  notify();//从this对象等待序列删除线程
  return this.i; //返回i
 }
 
 
 public  synchronized void put(int i)
 {
  if(!bFull) //如果为空
  {
   this.i=i; //放入数据
   bFull=true; //设置为TRUE
   notify();//从等待队列删除线程 
  }
  try
  {
   wait();//如果食物不是空那么进入等待队列
  }
  catch(Exception e)
    {
     e.printStackTrace();
   }
 
     }
}

 

时间: 2024-11-09 02:10:43

java多线程 生产者 消费者 问题 。。。的相关文章

java多线程,生产者消费者问题.

问题描述 java多线程,生产者消费者问题. 新手,在试着生产者消费者问题,刚开始的时候,SyncStack为空,但是会出现先执行c那个线程,打印出eat 0.然后才是produce: 0.jdk1.8的环境. 这个是为什么呀 public class ProducerConsumer{ public static void main(String[] args){ SyncStack ss = new SyncStack(); Producer p = new Producer(ss); Co

java 多线程生产者和消费者模式,怎么实现边生产边消费?

问题描述 java 多线程生产者和消费者模式,怎么实现边生产边消费? 如何使用java语言开发处理一批数据,使处理时间变快,而又不遗漏数据呢?? 解决方案 看瓶颈在哪里,如果是cpu.io的开销,性能不可能无限提高.如果存在网络延迟等,可以用多线程隐藏延迟,达到提高性能的目的. 解决方案二: 你说的什么叫边生产边消费呢?生产者消费者设计实现设计中生产者把数据放入队列,消费者从队列中获取数据处理,消除了生产者和消费者之间的代码依赖.该模式将生产数据的过程与使用数据的过程解耦,简化了由于这两个过程不

java实现生产者消费者问题(转)

引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 生产者消费者图 存储空间已满,而生产者占用着它,消费者等着生产者让出空间从而去除产品,生产者等着消费者消费产品,从而向空间中添加产品.互相等待,从而发生死锁. JAVA解决线程模型的三种方式 1.wait()和notify() import java.util.LinkedList; public class P

多线程-生产者消费者:openmp线程和windows线程混合编程问题

问题描述 生产者消费者:openmp线程和windows线程混合编程问题 求各位大神指导:参考生产者消费者模型,采用信号量唤起各处理函数,其函数中用openmp提速,处理时间有所降低,但存在的问题是初次调用函数时,第一次调用的时间消耗远多余后面调用的时间,不知道问题出现在哪里?是因为第一次需要线程创建消耗时间吗?(在使用openmp指令是并没有指明创建多少线程)

java多线程解决生产者消费者问题_java

本文实例讲述了java多线程解决生产者消费者问题的方法.分享给大家供大家参考.具体分析如下: 题目是这样的: 采用Java 多线程技术,设计实现一个符合生产者和消费者问题的程序.对一个对象(枪膛)进行操作,其最大容量是12颗子弹.生产者线程是一个压入线程,它不断向枪膛中压入子弹:消费者线程是一个射出线程,它不断从枪膛中射出子弹. 要求: (1)给出分析过程说明. (2)程序输出,要模拟体现对枪膛的压入和射出操作: (2)设计程序时应考虑到两个线程的同步问题. 这个和著名的生产者消费者问题几乎是一

Linux C实现生产者消费者问题

//信号量---线程间通信 //"生产者消费者" 问题 #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<semaphore.h> #include<pthread.h> #define msleep(x) usleep(x*1000) #define PRODUCT_SPEED 3 //生产速度 #define CONSUM_SPEED 1 //

[Java] 多线程下生产者消费者问题的五种同步方法实现

版权声明:请尊重个人劳动成果,转载注明出处,谢谢! 目录(?)[+] 生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题.    生产者消费者模式的优点 - 解耦 - 支持并发 - 支持忙闲不均 解决方法可分为两类:   (1)用信号量和锁机制实现生产者和消费者之间的同步:    - wait() / notify()方法  - await() / signal()方法  - BlockingQueue阻塞队列方法  - Semaphore方法    (2)在生产者和消费者之间建立一

Java多线程:“基础篇”11之生产消费者问题

1. 生产/消费者模型 生产/消费者问题是个非常典型的多线程问题,涉及到的对象包括"生产者"."消 费者"."仓库"和"产品".他们之间的关系如下: (01) 生产者仅仅在仓储未满时候生产,仓满则停止生产. (02) 消费者仅仅在仓储有产品时候才能消费,仓空则等待. (03) 当消费者发现仓储没产品可消费时候会通知生产者生产. (04) 生产者在生产出可消费产品时候,应该通知等待的消费者去消费. 2. 生产/消费者实现 下面通

java 生产者消费者问题 并发问题的解决(转)

引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 生产者消费者图 存储空间已满,而生产者占用着它,消费者等着生产者让出空间从而去除产品,生产者等着消费者消费产品,从而向空间中添加产品.互相等待,从而发生死锁. 生产者消费者问题是研究多线程程序时绕不开的经典问题之一,它描述是有一块缓冲区作为仓库,生产者可以将产品放入仓库,消费者则可以从仓库中取走产品.解决生产者/