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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 张俊迪 于 2013-5-28 01:09 编辑

class ShangPin//定义一个商品类
{
        String name;
        int num;
        boolean flag=true;
}
class Input implements Runnable
{
        private ShangPin s;
        Input(ShangPin s)
        {this.s=s;}
        public void run()
        {
                while(true)
                {
                    System.out.println(s.flag);
                        synchronized(s)
                        {
                                if(s.flag)
                                {
                                        try{s.wait();}catch(Exception e){}
                                }
                                System.out.println("生产");
                                s.flag=false;
                                s.notify();
                        }
                }
        }
}
class Output implements Runnable
{
        private ShangPin s;
        Output(ShangPin s)
        {
                this.s=s;
        }
        public void run()
        {
                while(true)
                {
                        
                        System.out.println(s.flag);
                        synchronized(s)
                        {
                                if(!s.flag)
                                {
                                        try{s.wait();}catch(Exception e){}
                                }
                                System.out.println("-------消费");        
                                s.flag=true;
                                s.notify();
                        }
                }
        }
}
class Thread1
{
        public static void main(String[] args)
        {
                ShangPin s=new ShangPin();
                Input in=new Input(s);
                Output out=new Output(s);
                Thread t1=new Thread(in);
                Thread t2=new Thread(out);
                t1.start();
                t2.start();
        }
}
我测试了,虽说不能交替出现,但是放上wait和notify输出结果会明显点这证明wait和notify起点作用,但是很不安全。我假设了下面的情况,也许是监听器不一致造成的,可如是本题的监听器不是ShangPin定义的这个s吗,他们不都是一样的吗,如果是定义了不同的锁了,可我的代码和老师定义多线程的方法是一样的,纠结呀,求解答

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 神马都是浮云

查看全部评分

4 个回复

倒序浏览
怪我没写注释呢,还是都躺下睡了,求解答呀呀呀呀
回复 使用道具 举报
首先,将类Output中的 s.flag=true;改为 s.flag=false;
然后,将类Input中的s.flag=false;改为s.flag=true;
原因:调用wait()方法后它后面的代码是不会执行的,假如先执行Input中的代码,调用wait()后会执行Output中的代码,但是Input类中的s.flag=false;这一语句没有执行,这一线程暂时暂停执行等待其他线程调用notify().这时候s.flag仍为true。

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
风爽 发表于 2013-5-28 00:49
首先,将类Output中的 s.flag=true;改为 s.flag=false;
然后,将类Input中的s.flag=false;改为s.flag=true ...

看出来了,我编译挨着一步一步走了看了,确实
回复 使用道具 举报
会了就好
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马