黑马程序员技术交流社区
标题:
关于多线程主函数中对象建立方式的疑问
[打印本页]
作者:
王利强
时间:
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