| 网站首页 | 资讯 | Hack | 漏洞 | 网管 | 编程 | 培训 | 品黑页 | 软件 | 论坛 | 动画 | 视频 | 经典 | 教学站 | 黑客点睛 | 
免费服务 我要发布 在线破解 黑客游戏 精华收集 免费空间 网络硬盘 独家报道 黑器点播 免费 FTP 交换资源
收费服务 黑客培训 光盘刻录 黑客书籍 视频下载 主力频道 空间域名 网站建设 特色服务 解决方案 我要投诉
您现在的位置: 华夏黑客同盟 >> 编程 >> 其它编程 >> 正文 用户登录 新用户注册
如何用JAVA实现“生产者”           ★★★ 【字体:
如何用JAVA实现“生产者”
作者:佚名 文章来源:本站原创 点击数: 更新时间:2008-8-24
  生产者和消费者问题是从操作系统中的许多实际同步问题中抽象出来的具有代表性的问题。它反映了操作系统中典型的同步例子。 

  生产者进程(进程由多个线程组成)生产信息,例如它可以是计算进程。消费者进程使用信息,它可以是输出打印进程。由于生产者和消费者彼此独立,且运行速度不确定,所以很可能出现生产者已产生了信息而消费者却没有来得及接受信息这种情况。为此,需要引入由一个或者若干个存储单元组成的临时存储区,以便存放生产者所产生的信息,平滑进程间由于速度不确定所带来的问题。这个临时存储区叫做缓冲区,通常用一维数组来表示。 

  由一个或若干个存储单元组成的缓冲区叫作“有穷缓冲区”。下面我们来分析一下有穷缓冲的生产者和消费者的例子。 
  假设有多个生产者和多个消费者,它们共享一个具有n个存储单元的有穷缓冲区Buffer(0……n-1),这是一个环形队列。其队尾指针Rear指向当前信息应存放的位置(Buffer[Rear]),队首指针Front指向当前取出信息的位置(Buffer[front])。生产者进程总是把信息存放在Buffer[Rear]中,消费者进程则总是从Buffer[Rear]中取出信息。如果想使生产者进程和消费者进程协调合作,则必须使它们
遵循如下规则: 

  1) 只要缓冲区有存储单元,生产者都可往其中存放信息;当缓冲区已满时,若任意生产者提出写要求,则都必须等待; 

  2) 只要缓冲区中有消息可取,消费者都可从缓冲区中取出消息;当缓冲区为空时,若任意消费者想取出信息,则必须等待; 

  3) 生产者们和消费者们不能同时读、写缓冲区。 

  用JAVA 实现“生产者-消费者”问题的代码如下: 

  class MonitorTest{ 

  static int produce_speed=200; 

  static int consume_speed=200; 

  public static void main (String [] args){ 

   if(args.length>0) 

   produce_speed=Integer.parseInt(args[0]); 

   if(args.length>1) 

   consume_speed=Integer.parseInt(args[1]); 

   Monitor monitor=new Monitor(); 

   new Producer(monitor,produce_speed); 

   new Consumer(monitor,consume_speed); 

   try{ 

   Thread.sleep(4000); 

   }catch(InterruptedException e){} 

   System.exit(0); 

   } 

  } 

  class Monitor { 

   int Buffer_Length=10; 

   int[] Buffer=new int[Buffer_Length]; 

   int Item; 

   int Count=0,Rear=0,Front=0; 

   //get buffer 

   synchronized int get(){ 

   if(Count ==0) 

   try{ 

   wait(); 

   }catch(InterruptedException e){} 

   Item=Buffer[Front]; 

   Count--; 

   Front=(Front+1)%Buffer_Length; 

   System.out.println("Got:"+Item); 

   notify(); 

   return Item; 

  } 

  //set buffer 

  synchronized void set(int value){ 

  if(Count==Buffer_Length) 

   try{ 

   wait(); 

   }catch(InterruptedException e){} 

   Buffer[Rear]=value; 

   Count++; 

   Rear=(Rear+1)%Buffer_Length; 

   System.out.println("Set:"+value); 

   notify(); 

   } 

  } 

  class Producer implements Runnable{ 

   Monitor monitor; 

   int speed; 

   Producer(Monitor monitor,int speed){ 

   This.monitor=monitor; 

   This.speed=speed; 

   new Thread(this,"Producer").start(); 

   } 

   public void run(){ 

   int i=0; 

   while(true){ 

   monitor.set(i++); 

   try{ 

   Thread.sleep((int)(Math.random()*speed)); 

   }catch(InterruptedException e){} 

   } 

   } 

  } 

  class Consumer implements Runnable{ 

   Monitor monitor; 

   int speed; 

   Consumer(Monitor monitor,int speed){ 

   This.monitor=monitor; 

   This.speed=speed; 

   new Thread(this,"Consumer").start(); 

   } 

   public void run(){ 

   while(true){ 

   monitor.get(); 

   try{ 

   Thread.sleep((int) (Math.random()*speed)); 

   }catch(InterruptedException e){} 

   } 

   } 

  } 

  上述程序在Windows 95的JDK 1.0.2下通过,它通过改变produce_speed 、consume_speed 来改变生产者进程和消费者进程的速度。 

责任编辑:朱倩  联系方式  Email:朱倩
电话:51228163
  • 上一篇编程:

  • 下一篇编程:
  • (只显示最新5条。评论内容只代表网友观点,与本站立场无关!)
    姓 名:
    * 游客填写  ·注册用户
    主 页:
    评 分:
    1分 2分 3分 4分 5分
    评论内容:
    验证码: *
  • 请遵守《互联网电子公告服务管理规定》及中华人民共和国其他各项有关法律法规。
  • 严禁发表危害国家安全、损害国家利益、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容的评论 。
  • 用户需对自己在使用本站服务过程中的行为承担法律责任(直接或间接导致的)。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表网友个人观点,与本网站立场无关。
  • 最新hack更新
    最新推荐资讯
    相关编程
    公历农历互查的JavaScript
    Java入门运算符优先级
    JAVA编译时的常见错误
    Spring中事件处理技巧
    Java泛型理解等价实现
    NetBeans网络开发构建GUI(一)
    如何用JAVA实现“生产者”
    Java线程的深入探讨
    Java语言的关键特性
    Java----介绍三个集合容器库
    最新会员软件
    最新推荐视频
    最新推荐动画

    Copyright @ 2005 77169.Net Inc. All rights reserved. 华夏黑客同盟 版权所有
    北京市电信通提供网络带宽

    mailto:webmaster@77169.net
    咨询QQ号:836982 / 59280880
    联系站长 QQ38588913
    热线电话: 86-10-67634029/676229433
    京ICP证041431号