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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

class Produse
{
        private String name;
        private int counter=1;
        private boolean flag=false;
        public synchronized void set(String name)
        {
                if(flag)
                {
                        try
                        {
                                wait();
                        }
                        catch (Exception a)
                        {
                        }
                }
                this.name=name;
                System.out.println(Thread.currentThread().getName()+"///shengchan//////////"+counter);
                this.notify();//唤醒
                flag=true;//将标志位置真

       
        }
        public synchronized void get()
        {
                while(!flag)
                {
                        try
                        {
                                wait();
                        }
                        catch (Exception a)
                        {
                        }
                }
                System.out.println(Thread.currentThread().getName()+"///消费者////"+counter++);
                this.notify();
                flag=false;
        }
}

class ShengChan implements Runnable
{
        private Produse pro;
        ShengChan(Produse pro)
        {
                this.pro=pro;
       
        }
        public void run()
        {
                while(true)
                {
                pro.set("商品");//生产
                }
        }

}
class XiaoFei implements Runnable
{
        private Produse pro;
        XiaoFei(Produse pro)
        {
                this.pro=pro;
        }
        public void run()
        {
                        while(true)
                        {
                                pro.get();
                        }
        }
}

class  ProduseDemo
{
        public static void main(String[] args)
        {
                Produse pro=new Produse();
                ShengChan s=new ShengChan(pro);
                XiaoFei x=new XiaoFei(pro);
                Thread t1=new Thread(s);
                Thread t2=new Thread(s);
                Thread t3=new Thread(x);
                Thread t4=new Thread(x);
                t1.start();
                t2.start();
                t3.start();
                t4.start();
        }
毕老师讲的这个线程间通信,生产者与消费者,全部等待. 就是把if换成while,还用notify ,为什么会全部等待  弄不懂啊

1 个回复

倒序浏览
因为如果哪一次生产的线程notify叫醒的是本方的另一个生产线程,那么不就是没有叫醒另一个线程之前直接判断标记等待了吗...
虽有JDK1.5后lock出现了,不是全部叫醒,而是只叫醒对方,增加一些效率
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马