黑马程序员技术交流社区

标题: 生产者消费者问题 [打印本页]

作者: 请备注    时间: 2014-4-4 14:43
标题: 生产者消费者问题
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的时候初始化的。
作者: 一年_Hei    时间: 2014-4-4 15:00
1  肯定只建了一个Resource,这个例子就是为了多线程时确保资源的安全
作者: 一年_Hei    时间: 2014-4-4 15:08
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);
}


作者: 请备注    时间: 2014-4-4 15:17
一年_Hei 发表于 2014-4-4 15:08
2 把r换成res对程序来说一样的,就想Person p = new Person(); Person person = new Person(); 一样,就是 ...

懂一些了 :D




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2