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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 请备注 中级黑马   /  2014-4-4 14:43  /  1212 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class ProducerDemo
{
        public static void main(String[] args)
        {
            Resource r = new Resource();
            Producer pro = new Producer(r);
            Consumer con = new Consumer(r);

            Thread t1 = new Thread(pro);
            Thread t2 = new Thread(con);

            t1.start();       
            t2.start();

        }
}

class Resource
{
        private String name;
        private int count = 1;
        private boolean flag = false;
  
        public synchronized void set(String name)
        {
            if(flag)
                try{wait();}catch(Exception e){}
            this.name = name+"--"+count++;
       
            System.out.println(Thread.currentThread().getName()+"..生产者.."+this.name);
            flag = true;
            this.notify();
        }

        public synchronized void out()
        {
            if(!flag)
                try{wait();}catch(Exception e){}
            System.out.println(Thread.currentThread().getName()+"..消费者.."+this.name);
            flag = false;
            this.notify();
        }
}

class Producer implements Runnable
{
        private Resource res;
        Producer(Resource res)
        {
             this.res = res;
        }
        public void run()
        {
            while(true)       
            {
                res.set("商品");
            }
        }
}

class Consumer implements Runnable
{
        private Resource res;
        Consumer(Resource res)
        {
             this.res = res;
        }
        public void run()
        {
            while(true)       
            {
                res.out();
            }
        }
}

1,  我的疑问是这个代码里是不是建了3个Resource对象。
2,  Resource r = new Resource();   把这个语句里的r换成res 有什么 区别,运行可以,我测试了。
3,如果把r换成了res,那么res对象是在new的时候初始化的还是在private的时候初始化的。

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

3 个回复

倒序浏览
1  肯定只建了一个Resource,这个例子就是为了多线程时确保资源的安全
回复 使用道具 举报
2 把r换成res对程序来说一样的,就想Person p = new Person(); Person person = new Person(); 一样,就是引用的名称不一样
3 这个肯定是new的时候初始化,Producer pro = new Producer(r);
            Consumer con = new Consumer(r);
这里是把资源的引用传给了生存者和消费者,就相当于将一个对象作为参数传递一样,引用的还是同一个对象
Person p = new Person();   
function(p);
public void function(Person p){
  System.out.println(p);
}

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
一年_Hei 发表于 2014-4-4 15:08
2 把r换成res对程序来说一样的,就想Person p = new Person(); Person person = new Person(); 一样,就是 ...

懂一些了 :D
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马