A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孙飞 中级黑马   /  2012-6-30 12:28  /  1356 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 feigecal 于 2012-6-30 16:05 编辑

class Resource
{
        private String name;
        private int count=1;
        private boolean flag=false;
        public synchronized void setName(String name)
        {
                while(flag)
                {
                                try{this.wait();}catch(Exception e){}
                                this.name=name+"----"+count++;
                                System.out.println(Thread.currentThread().getName()+"---shengchan---"+this.name);
                                flag=true;
                                this.notifyAll();
                }
        }
        public synchronized void out()
        {
                while(!flag)
                        try{this.wait();}catch(Exception e){}
                        System.out.println(Thread.currentThread().getName()+"---xiaofei---"+this.name);
                        flag=false;
                        this.notifyAll();
        }

}
class Producer implements Runnable
{
        private Resource rec;
        Producer(Resource rec)
        {
                this.rec=rec;
        }
        public void run()
        {
                while(true)
                {
                        rec.setName("shangpin");
                }
        }
}
class Consume implements Runnable
{
        private Resource rec;
        Consume(Resource rec)
        {
                this.rec=rec;
        }
        public void run()
        {
                while(true)
                {
                        rec.out();
                }
        }
}
class ShopDemo
{
        public static void main(String[] args)
        {
                Resource r=new Resource();
                //System.out.println("Hello World!");
                Producer p=new Producer(r);
                Consume c=new Consume(r);
                Thread t1=new Thread(p);
                Thread t2=new Thread(p);
                Thread t3=new Thread(c);
                Thread t4=new Thread(c);
                t1.start();
                t2.start();
                t3.start();
                t4.start();
        }
}

2 个回复

倒序浏览
    public synchronized void setName(String name)
         {
                 while(flag)
                 {
                                 try{this.wait();}catch(Exception e){}
                                 this.name=name+"----"+count++;
                                 System.out.println(Thread.currentThread().getName()+"---shengchan---"+this.name);
                                 flag=true;
                                 this.notifyAll();
                 }
         }
这段代码错了,这种情况下一旦flag=true,则进程就一直等待,因为线程执行不了try语句块后面的语句,正确的代码是
    public synchronized void setName(String name)
         {
                 while(flag)
                 {
                                 try{this.wait();}catch(Exception e){}
                 }
                                 this.name=name+"----"+count++;
                                 System.out.println(Thread.currentThread().getName()+"---shengchan---"+this.name);
                                 flag=true;
                                 this.notifyAll();
                 
         }
回复 使用道具 举报
邓超军 发表于 2012-6-30 12:54
public synchronized void setName(String name)
         {
                 while(flag)

就是这个问题
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马