黑马程序员技术交流社区

标题: 纠结的多线程,为什么生产和消费不能交替输出 [打印本页]

作者: 张俊迪    时间: 2013-5-28 00:08
标题: 纠结的多线程,为什么生产和消费不能交替输出
本帖最后由 张俊迪 于 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吗,他们不都是一样的吗,如果是定义了不同的锁了,可我的代码和老师定义多线程的方法是一样的,纠结呀,求解答
作者: 张俊迪    时间: 2013-5-28 00:37
怪我没写注释呢,还是都躺下睡了,求解答呀呀呀呀
作者: 风爽    时间: 2013-5-28 00:49
首先,将类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。
作者: 张俊迪    时间: 2013-5-28 00:57
风爽 发表于 2013-5-28 00:49
首先,将类Output中的 s.flag=true;改为 s.flag=false;
然后,将类Input中的s.flag=false;改为s.flag=true ...

看出来了,我编译挨着一步一步走了看了,确实
作者: 风爽    时间: 2013-5-28 00:58
会了就好




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