黑马程序员技术交流社区

标题: 帮忙差错 [打印本页]

作者: 乔九    时间: 2012-9-10 21:49
标题: 帮忙差错
class ProducerConsumerDemo
{
    public static void mian(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{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{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-9-10 21:58
public class ProducerConsumerDemo {
        public static void mian(String[] args) {//这里写错了。main()否则编译器找不到入口
                Resource r = new Resource();
                Resource.Producer pro = new Resource().new Producer(r);//你的Producer类定义的是内部类所以要通过外部类调用
                Resource.Consumer con =  new Resource().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{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{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();
                        }
                }
        }
}


在外部类的外部,要创建一个成员内部类对象,要首先建立一个外部类对象,然后再创建一个成员内部类对象。

                Outer out = new Outer();

                Outer.Inner in = out.new Inner();

            在本类内部生成内部类对象的方式:

                在静态方法中:Inner in = new Outer().new Inner();

                在非静态方法中:Inner in = this.new Inner();




作者: 梁志冰    时间: 2012-9-10 22:11
class ProducerConsumerDemo
{
    //首先,你的主函数方法的格式错了
public static void main(String[] args)
     {
         Resource r=new Resource();
   //你原来定义Producer和Consumer都放到了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{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{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-9-10 23:35
class ProducerConsumerDemo
{
    public static void mian(String[] args)  打错了,是main,不是mian
     {
         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)  这应该是while循环,时每个醒来的线程重复判断标记
          try{wait();}catch(Exception e){}
        this.name=name+"--"+count++;
        System.out.println(Thread.currentThread().getName()+" 生产

者"+this.name);
        flag=true;
        this.notify(); 应该是notifyAll。
                            如果是notify只唤醒自己的线程,而我们需要唤醒对方的线程,
                            所以就用notifyAll唤醒所有线程
      
   }
  public synchronized void out()
  {
      if(!flag)  同上
        try{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("商品");
          }
        }





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