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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 belief丶Only 于 2013-12-18 10:41 编辑

所有代码如下.问题是:我在赋值name和sex的set方法,只写if不写else就是对的,我写if加else判断为什么结果不是我想要的.
我判断的是boolean类型.就有两可能,加上else为什么输出的就不行了?
具体的问题我写在代码注释里了,如下:
  1. class Resource
  2.         {
  3.                 private String name;
  4.                 private String sex;
  5.                 private boolean flag = false;
  6.                 public synchronized void set(String name,String sex)
  7.                 {
  8.                         if(flag)
  9.                         {
  10.                                 try
  11.                                 {
  12.                                         this.wait();
  13.                                 }
  14.                                 catch (InterruptedException e)
  15.                                 {
  16.                                 // TODO Auto-generated catch block
  17.                                         e.printStackTrace();
  18.                                 }
  19.                         }
  20.                         /*在这里加上else后输出结果就变成了一大片 "张三...男" 又输出一大片"李思...女"....
  21.                          * 去掉之后是我要的正确结果输出一次"张三...男" 再输出一次"李思...女"...
  22.                          * else有错吗??为什么加了else就不能让线程冻结吗?
  23.                          * */
  24.                         else            
  25.                         {
  26.                                 this.name=name;
  27.                                 this.sex=sex;
  28.                                 flag = true;
  29.                                 this.notify();
  30.                         }
  31.                 }
  32.                 public synchronized void out()
  33.                 {
  34.                         if(!flag)
  35.                         {
  36.                                 try
  37.                                 {
  38.                                         this.wait();
  39.                                 }
  40.                                         catch (InterruptedException e)
  41.                                 {
  42.                                         // TODO Auto-generated catch block
  43.                                         e.printStackTrace();
  44.                                 }
  45.                         }
  46.                         else
  47.                         {
  48.                         System.out.println(name+"..."+sex);        
  49.                         flag =false;
  50.                         notify();
  51.                         }
  52.                 }
  53.         }
  54. //输入
  55.         class Input implements Runnable
  56.         {        
  57.                 Resource r;
  58.                 Input(Resource r)
  59.                 {
  60.                         this.r = r;
  61.                 }
  62.                 public void run()
  63.                 {
  64.                         int i = 0;
  65.                         while(true)
  66.                         {
  67.                         if(i==0)
  68.                         {
  69.                                 r.set("张三","男");
  70.                         }
  71.                         else
  72.                         {
  73.                                 r.set("李思","女");
  74.                         }
  75.                         i = (i+1)%2;
  76.                         }
  77.                 }
  78.         }
  79. //输出
  80.         class output implements Runnable
  81.         {
  82.                 Resource r;
  83.                 output(Resource r)
  84.                 {
  85.                         this.r = r;
  86.                 }
  87.                 public void run()
  88.                 {
  89.                         while(true)
  90.                         {
  91.                                 r.out();
  92.                         }
  93.                 }
  94.                
  95.         }
  96. public class WaitAndNotify {
  97.         public static void main(String[] str)
  98.         {
  99.                 Resource r = new Resource();
  100.                 Input t = new Input(r);
  101.                 output o = new output(r);
  102.                 Thread t1 = new Thread(t);
  103.                 Thread t2 = new Thread(o);
  104.                 t1.start();
  105.                 t2.start();
  106.         }
  107. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 赞一个!

查看全部评分

2 个回复

倒序浏览
当t1拿到cpu执行权的时候,执行while循环,第一次 循环i=0,调用的方法是set(张三,男),然后判断为不满足条件执行else下面的语句, 这时候i=1了,fasle = true while在循环,调用的是set(李思,女) 然后t1在去判断,满足条件了t1线程等待,释放执行权
t2拿到执行权之后判断,有值的话,执行输出,然后flag=false;唤醒t1,然后t2在判断,没有值,t2线程等待,释放执行权,
这时候t1拿到执行权的时候,i=1;他执行完if{}里面语句的时候,不执行else的,没有赋值
当在循环一次的时候,i=2,调用的还是set.(张三,男),你set(李思,女)根本没调用到,
反之是一样的。所以才打印出一大片,一大片的打印。没有交替打印

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 很给力!

查看全部评分

回复 使用道具 举报
一年之后 发表于 2013-12-18 11:24
当t1拿到cpu执行权的时候,执行while循环,第一次 循环i=0,调用的方法是set(张三,男),然后判断为不满足 ...

对对,明白了!谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马