CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Java >  Web 开发

理解线程的不错的例子

楼主stephen722(醉一笑)2006-07-04 18:10:09 在 Java / Web 开发 提问

以下是Thanking   in   Java   上的关于线程之间的协作关系的一段代码,  
  程序简单,是理解多线程之间协作的一个典型的例子;  
  就我的理解与大家分享,不妥之处,望纠正!  
   
  order   订单  waitperson   服务员   Chef     厨师  
  服务员必须等待厨师做好菜后才能够去端菜,当厨师做好菜后,通知服务员,服务员端菜送上餐桌后,回来继续等待。  
   
  class   Order   {            
  private   static   int   i=0;  
  private   int   count=++i;  
  public   Order(){  
  if(count==10){  
  System.out.println("Out   of   food,closing");  
  System.exit(0);  
  }  
  }  
  public   String   toString(){  
  return   "Order   "+count;  
  }  
  }  
   
  class   WaitPerson   extends   Thread{  
  private   Restaurant   restaurant;  
  public   WaitPerson(Restaurant   r){    
  restaurant   =   r;   //将main中的restaurant赋值进来,往下执行。  
  start();    
  }  
   
  public   void   run(){  
  while   (true){  
  while   (restaurant.order==null)  
  synchronized(this){   //此处的加锁,使得waitperson等待,程序跳转到main中执行最后一句。  
  try{  
  wait();//程序从notify()跳转到此处,程序往下执行。  
  }catch(InterruptedException   ie){  
  throw   new   RuntimeException(ie);  
  }  
  }  
  System.out.println(  
  "Waitperson   got   "+restaurant.order   );  
  //输出,程序转到Order的toString();然后输出,回到此处,程序继续往下执行。  
  //此时相当于完成这样一个过程:一个等待的服务员,做好菜的厨师叫这个服务员送菜  
  //(及此处的输出)。  
  restaurant.order=null;//赋空值给restaurant.order   很关键,这样的赋值使得    
  //刚送完菜的服务员又回来等待,程序跳转到上面   判断到restaurant.order==null    
  //故加锁   服务员等待。即重复上面的过程。此时程序跳转到   chef的notify()后面,  
  //继续执行。重复此过程。  
  }  
  }  
  }  
   
  class   Chef   extends   Thread{  
  private   Restaurant   restaurant;  
  private   WaitPerson   waitperson;  
  public   Chef(Restaurant   r,WaitPerson   w){  
  restaurant   =   r;   //赋值后程序往下执行。  
  waitperson   =   w;  
  start();  
  }  
  public   void   run(){  
  while(true){    
  if(restaurant.order==null){   //此处是关键所在,因为main中实例化一个Restaurant  
  //对象,只是声明一个order,但没有定义。  
  restaurant.order   =   new   Order();//实例化一个Order,同时调用其构造函数判断是否  
  //满足退出程序的条件   及是否count==10   ,如果满足条件程序退出,否则,程序往下  
  //继续执行。  
  System.out.print("Order   Up!   ");//  
  synchronized(waitperson){    
  waitperson.notify();//唤醒前面的wait();程序跳转到wait()处。  
  }  
  }  
  try{  
  sleep(1000);  
  }catch(InterruptedException   ie){  
  throw   new   RuntimeException(ie);  
  }  
  }  
  }  
  }  
   
  public   class   Restaurant   extends   Thread   {  
   
  Order   order;  
  public   static   void   main(String[]   args)   {  
  //   TODO   Auto-generated   method   stub  
  Restaurant   restaurant   =   new   Restaurant();  
  //   程序从这里开始,实例化一个Restaurant对象,声明一个order,但没有定义  
  WaitPerson   waitperson   =   new   WaitPerson(restaurant);  
  //调用WaitPerson的构造方法   程序跳转到WaitPerson构造方法  
  Chef   chef   =   new   Chef(restaurant,waitperson);  
  //调用Chef的构造方法,同时赋值,   程序跳转到Chef构造方法,  
   
  }  
   
  }  
   
  结果:  
  Order   Up!   Waitperson   got   Order   1  
  Order   Up!   Waitperson   got   Order   2  
  Order   Up!   Waitperson   got   Order   3  
  Order   Up!   Waitperson   got   Order   4  
  Order   Up!   Waitperson   got   Order   5  
  Order   Up!   Waitperson   got   Order   6  
  Order   Up!   Waitperson   got   Order   7  
  Order   Up!   Waitperson   got   Order   8  
  Order   Up!   Waitperson   got   Order   9  
  Out   of   food,closing  
   
  问题点数:0、回复次数:1Top

1 楼zpc10(张三)回复于 2006-07-04 18:15:57 得分 0

嗯,精神可嘉,特提出表扬!Top

相关问题

关键词

得分解答快速导航

  • 帖主:stephen722

相关链接

  • CSDN Java频道
  • Java类图书
  • Java类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo