class Info
{
private boolean flag=false;  //定义标志位
private String name;     //定义姓名字段
private String content;  //定义内容字段
public String getName()  //获取姓名信息
{
return this.name;
}
public String getContent()//获取内容信息
{
return this.content;
}
public void setName(String name) //设置姓名
{
       this.name=name;
}
public void setContent(String content) //设置内容字段
{
this.content=content;
}
public synchronized void set(String name,String content)
{
if(!flag)
{
super.notify();  //唤醒线程,进行排队
this.setName(name); //设置姓名字段
try
{
Thread.sleep(300);
}
catch (Exception e)
{
e.printStackTrace(); //输出异常
}
this.setContent(content);//设置内容字段
flag=true;
}
else
{
try
{
super.wait(); //暂停线程
}
catch (Exception e)
{
e.printStackTrace(); //输出异常
}
flag=false; 
}
}
public synchronized void get()
{
        if(flag)
{
super.notify(); //唤醒线程
try
{
Thread.sleep(200);
}
catch (Exception e)
{
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"消费者:产品信息--->名称:"+this.getName()+" 内容:"+this.getContent());
    flag=false;
}
else
{
try
{
super.wait(); //线程等待
}
catch (Exception e)
{
e.printStackTrace();
}
flag=true;
}
}
}
class Consumer implements Runnable //实现Runnable接口
{
private Info info=null; //消费者消费产品
Consumer(Info info) //构造函数
{
this.info=info;  //对象直接"="操作
}
    public void run() //重写run()方法
{
for(int i=0;i<50;i++)
{
this.info.get();
}
}
}
class Producter implements Runnable  //实现Runnable接口
{
private Info info=null; //生产者生产产品
Producter(Info info) //构造方法
{
this.info=info;
}
public void run() //重写run()方法
{
boolean flag=false; //定义标志位
for(int i=0;i<50;i++)
{
if(flag)
{
               this.info.set("李兴华","JAVA讲师");
   flag=false;
}
else
{
this.info.set("王国亮","千万富翁");
flag=true;
}
}
}
}
public class ThreadCaseDemo02
{
public static void main(String args[])
{
Info i=new Info(); //生成产品
        Consumer a=new Consumer(i); //消费者对象
Producter b=new Producter(i); //生产者对象
Thread c=new Thread(a);
Thread d=new Thread(b);
d.start();
c.start();
}
}
求解呀。我想问:为什么同步机制已经加载进入函数里边,然后用了Object类的唤醒等待机制,还是无法实现生产一个、消费一个产品的目的???。各位大侠帮忙解释一下呀!!!

解决方案 »

  1.   

    LZ没有设置共享变量来控制。如: boolean flag=false; //定义标志位百度一下,很多参照的例子。
      

  2.   

    public synchronized void set(String name,String content){
    if(!flag){
    super.notify(); //唤醒线程,进行排队
    this.setName(name); //设置姓名字段
    try
    {
    Thread.sleep(300);
    }
    catch (Exception e)
    {
    e.printStackTrace(); //输出异常
    }
    this.setContent(content);//设置内容字段
    flag=true;
    }
    else
    {
    try
    {
    super.wait(); //暂停线程
    }
    catch (Exception e)
    {
    e.printStackTrace(); //输出异常
    }
    flag=false;  
    }
    加了。。标志位的。
      

  3.   

    这是一个有条件等待的问题。你需要把等待的操作放在循环中。举个例子,你的消费者调用get,在get中发现flag为false,于是就去wait,当这个wait醒过来以后,这个get调用就结束了。没有取走任何元素就结束了。然后生产者又去生产,这样就失去了一次消费。这个程序的框架应该是这样的:synchronzed (lock) {
      while (condition == false)
        wait  do your work
      notify all}
      

  4.   

    public synchronized void set(String name,String content) {
    if(!flag)
    {
    this.setName(name); //设置姓名字段
    try
    {
    Thread.sleep(300);
    }
    catch (Exception e)
    {
    e.printStackTrace(); //输出异常
    }
    this.setContent(content);//设置内容字段
    super.notify();  //唤醒线程,进行排队
    flag=true;
    }

    try
    {
    super.wait(); //暂停线程
    }
    catch (Exception e)
    {
    e.printStackTrace(); //输出异常
    }
    flag=false; 

    }
    我把以上代码的set部分修改之后如上想问各位高手是不是其中一个线程休眠之后。。另一个线程就会run()起来。。,假设produter()线程休眠,是不是consumer就会run()起来。
      

  5.   

    如果你说的休眠是指sleep的话,一个线程是否休眠和另一个线程没有关系。所谓多线程,就是多个线程同时在run另外,你一个线程sleep的话,锁还是他的,如果别的线程要锁,还是要等前者释放。
      

  6.   

    额。。貌似是这么个道理。。但我想请问楼上的大哥呀。。为什么我的程序还是会执行五十次呢???照这个思路来讲的话。。如果生产者抢到CPU,但此时存在商品。然后就会导致生产者的线程休眠。无法制造商品了。然后这次机会就错了。。但是i++会记一次数值呀。。但为什么我运行下来。。结果还是消费了五十次商品。????消费了五十次也就意味着创造了五十次。。我这样理解对吧。