黑马程序员技术交流社区
标题:
多线程上的一个小问题
[打印本页]
作者:
630681386@qq.co
时间:
2014-2-9 14:49
标题:
多线程上的一个小问题
/*多线程 等待唤醒机制中的经典案例,生产者和消费者的问题*/
class Resrour//共享资源
{
private String name;
private int a=1;
private boolean flag=false;
public synchronized void set(String name)
{
while(flag)
try{this.wait();}catch(InterruptedException e){}
this.name= name + a;
a++;
System.out.println(Thread.currentThread().getName()+"..生产者生产了...."+name);
[color=Red]我就是奇怪,这里为什么不输出编号[/color]
flag=true;//存完值后更改标记变量
notify();//唤醒读取线程
}
public synchronized void out()
{
while(!flag)
try{this.wait();}catch(InterruptedException e){}
System.out.println(Thread.currentThread().getName()+"..消费者消费了........"+name);
flag=false;
notify();
}
}
//生产者线程任务
class Producer implements Runnable
{
private Resrour r;
Producer(Resrour r)
{
this.r=r;
}
public void run()
{
while(true)
{
r.set("烤鸭");
}
}
}
//消费者线程任务
class Consumer implements Runnable
{
private Resrour r;
Consumer(Resrour r)
{
this.r=r;
}
public void run()
{
while(true)
{
r.out();
}
}
}
class ThreadDemo3
{
public static void main(String[] args)
{
Resrour r=new Resrour();
Producer pr=new Producer(r);
Consumer co=new Consumer(r);
Thread t0=new Thread(pr);
Thread t1=new Thread(pr);
Thread t2=new Thread(co);
Thread t3=new Thread(co);
t0.start();
t1.start();
t2.start();
t3.start();
}
}
复制代码
作者:
郭运川
时间:
2014-2-9 16:06
这个问题涉及到变量的作用于问题
输出编号的name是类Resrour的成员变量
在java中,在成员函数内如果有变量名和成员变量名相同,函数会优先调用自身定义或者收到的参数,若无才会去类的成员变量中去寻找。想直接调用类的成员变量,此时就要把成员变量就要加this给与区分
this.name(指的是类的成员变量)= name(方法的参数) + a;
System.out.println(Thread.currentThread().getName()+"..生产者生产了...."+name(使用this.name替换name即可,));
作者:
2424308
时间:
2014-2-9 16:24
死锁了
将notify()改成notifyAll()就好了
作者:
zc332750
时间:
2014-2-10 11:39
System.out.println(Thread.currentThread().getName()+"..生产者生产了...."+name); 这个name是set方法传参传进来的name,你并没有把这个参数加上编号,自然不能打印出编号了。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2