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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

下面代码中主函数里的Producer pro=new Producer(r);   后面的括号里的参数r有什么作用,是为了和Producer里的构造函数的形参相对应么?如果是这样的话把producer类里的有参构造函数去掉行不,默认就有无参的构造函数,那样Producer pro=new Producer(r);  后面括号里的参数r不是就可以不用了嘛?但我用代码验证了下,这样是行不通的,求高手指点下,一到线程这里就感觉到有许多地方不懂了                    

class  producerConsumerDemo
{
        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{this.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{this.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技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

3 个回复

正序浏览
这里的这个r是必须要有的。将r传进去,这么做的目的,是为了给生产者和消费者加上同一个锁,这样就能保证了他们操作的是同一堆资源,否则他们很可能会出现数据错乱。
这里你不明白的应该就是同步的前提条件以及它的好处和弊端:
同步的前提:
1,必须要有两个或者两个以上的线程。
2,必须是多个线程使用同一个锁。
必须保证同步中只能由一个线程在运行。
好处:解决了多线程的安全问题。
弊端:多个线程需啊哟判断锁,较为消耗资源。

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
Producer pro=new Producer(r);   后面的括号里的参数r有什么作用:r的作用是初始化成员变量private Resource res;当我们new一个对象时,系统会自动调用构造函数 Producer(Resource res)给成员变量一个初值。

回复 使用道具 举报
Producer pro=new Producer(r);   后面的括号里的参数r 是为了让Producer或者Customer 在初始化时 获取资源Resource的实例对象
用以保证Producer和Customer共同操作一个资源对象.
如果两个线程操作分别不同资源对象,就成了单线程,则不存在同步问题.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马