A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© More 中级黑马   /  2014-7-13 06:39  /  891 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class Res
  2. {
  3.         String name;
  4.         String sex;
  5.         boolean flag=false;
  6. }
  7. class Input implements Runnable
  8. {
  9.         //Object b=new Object();//这样定义对象  把obj作为锁但是Output上也定义了obj但是两者不是同一个对象
  10.         private int x=0;
  11.         private Res r;
  12.         Input(Res r){
  13.                 this.r=r;       
  14.         }
  15.         //Res r=new Res();//在Output中也创建了Res对象,这样相当于创建了两个对象,不符合本意
  16.         public void run(){//对name和sex进行赋值
  17.                 while(true)
  18.                 {
  19.                         //同步代码块
  20.                         synchronized(r)//将r作为锁  和Output是同一把锁
  21.                         {
  22.                                 if(r.flag){
  23.                                         try{r.wait();}catch(Exception e){}
  24.                                 }else{
  25.                                         if(x==0){
  26.                                                 r.name="mike";
  27.                                                 r.sex="man";
  28.                                         }else{
  29.                                                 r.name="丽丽";
  30.                                                 r.sex="女女女女";
  31.                                         }
  32.                                         x=(x+1)%2;
  33.                                         r.flag=true;
  34.                                         r.notify();
  35.                                 }
  36.                                
  37.                         }

  38.                 }
  39.         }
  40. }
  41. class Output implements Runnable
  42. {
  43.         private Res r;
  44.         //Object b=new Object();//这样定义对象  把obj作为锁但是Input上也定义了obj但是两者不是同一个对象
  45.         Output(Res r){
  46.                 this.r=r;       
  47.         }
  48.         //Res r=new Res();
  49.         public void run(){//提取name和sex的值
  50.                 while(true){
  51.                         synchronized(r){//将r作为锁  和Input是同一把锁
  52.                                 if(!r.flag){
  53.                                         try{r.wait();}catch(Exception e){}
  54.                                 }else{
  55.                                         System.out.println(r.name+"....."+r.sex);
  56.                                 }
  57.                                 r.flag=false;
  58.                                 r.notify();
  59.                                
  60.                         }
  61.                 }
  62.         }
  63. }
  64. class InputOutputDemo
  65. {
  66.         public static void main(String[] args)
  67.         {
  68.                 Res r=new Res();
  69.                 //Input Output使用同一个对象
  70.                 Input in=new Input(r);
  71.                 Output out=new Output(r);
  72.                 Thread t1=new Thread(in);
  73.                 Thread t2=new Thread(out);
  74.                 t1.start();
  75.                 t2.start();
  76.         }
  77. }
复制代码

输出时,为什么产生不了赋值一遍就打印一遍的效果??

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马