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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马十八期0513 中级黑马   /  2012-12-1 10:35  /  1183 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Res
{
String name;
String sex;
boolean flag =false;
}
class Input implements Runnable
{
private Res r;
Input(Res r)
{
  this.r =r;
}
public void run()
{
  int x=0;
  while(true)
  {
   synchronized(r)
   {
    if(r.flag)
     try{r.wait();}catch(Exception e){}
    if(x==0)
    {
     r.name="mike";
     r.sex="man";
    }
    else
    {
     r.name="丽丽";
     r.sex="女女女女女女";
    }
    x =(x+1)%2;
    r.flag =true;
    r.notify();
   }
  }
}
}
class Output implements Runnable
{
private Res r;
Output(Res r)
{
  this.r =r;
}
public void run()
{
  while(true)
  {
   if(!r.flag)
    try{r.wait();}catch(Exception e){}
   synchronized(r)
   {
    System.out.println(r.name+"..."+r.sex);
    r.flag =false;
    r.notify();
   }
  }
}
}

class InputOutputDemo
{
public static void main(String[] args)
{
  Res r =new Res();
  Input in =new Input(r);
  Output out =new Output(r);
  Thread t1 =new Thread(in);
  Thread t2 =new Thread(out);
  t1.start();
  t2.start();
}
}

有两个问题:
1
class Input implements Runnable
{
private Res r;
Input(Res r)
{
  this.r =r;
}

class Output implements Runnable
{
private Res r;
Output(Res r)
{
  this.r =r;
}

这两段代码是怎么想出来的?我看着都感觉很难理解的,这是怎么想出来的?

2 为什么我的运行结果不对?没有达到输入一个输出一个的结果。代码中哪儿出了问题?


未命名.jpg (56.14 KB, 下载次数: 41)

连续打印出多个丽丽女

连续打印出多个丽丽女

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

2 个回复

倒序浏览
1.那两段代码是为了使得两个类使用同一个Res实例出的对象,否各自使用各自的资源对象,这两个线程就不是在操作同一个数据资源了。

2.你的代码:
class Output implements Runnable
{
        private Res r;

        Output(Res r)
        {
                this.r = r;
        }

        public void run()
        {
                while (true)
                {
                        synchronized (r)//此处位置放错了,都需要加锁
                        {
                                if (!r.flag)
                                        try
                                        {
                                                r.wait();
                                        } catch (Exception e)
                                        {
                                        }

                                System.out.println(r.name + "..." + r.sex);
                                r.flag = false;
                                r.notify();
                        }
                }
        }
}

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
1)当你在main方法中 Res r =new Res();的时候产生了共享资源对象 r
2) Input in =new Input(r);Output out =new Output(r);将 r 分别传入 Input 和 Output的构造函数
3)通过调用构造函数将传入的对象引用分别赋给 Input 和 Output  内部使他们两产生的对象in和out持有相同的引用,即两个run方法可以操作同一资源

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马