黑马程序员技术交流社区

标题: 关于多线程主函数中对象建立方式的疑问 [打印本页]

作者: 王利强    时间: 2012-3-15 00:11
标题: 关于多线程主函数中对象建立方式的疑问
下面代码中主函数里的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();}
        }
}

作者: 田啸    时间: 2012-3-15 00:25
Producer pro=new Producer(r);   后面的括号里的参数r 是为了让Producer或者Customer 在初始化时 获取资源Resource的实例对象
用以保证Producer和Customer共同操作一个资源对象.
如果两个线程操作分别不同资源对象,就成了单线程,则不存在同步问题.
作者: 蒙武辉    时间: 2012-3-15 00:43
Producer pro=new Producer(r);   后面的括号里的参数r有什么作用:r的作用是初始化成员变量private Resource res;当我们new一个对象时,系统会自动调用构造函数 Producer(Resource res)给成员变量一个初值。


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




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