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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© xibozglr 中级黑马   /  2013-11-29 08:44  /  1226 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 xibozglr 于 2013-11-29 19:07 编辑

生产者消费者问题,为什么t1和t2线程执行不完啊???到这晕菜了,线程是怎么循环啊??什么时候线程执行完毕啊???

//描述资源
class ZiYuan
{
        private String name;
        private int count;
        
        //定义标记
        private boolean flag;

        //提供给商品赋值的方法
        public synchronized void set(String name)
        {
                if(flag)//判断标记为true,执行wait等待,为false,就生产
                        
                {
                        try
                        {
                                wait();
                        }
                        catch (InterruptedException e)
                        {
                        }
                }
               
                this.name=name+"--"+count;
                count++;

                System.out.println(Thread.currentThread().getName()+"生产"+this.name);

                //生产完毕,将标记改为true
                flag=true;
                //唤醒消费者
                notify();
        }

   //提供获取商品的方法
        public synchronized void get()
        {
                if(!flag)
                {
                        try
                        {
                                wait();
                        }
                        catch (InterruptedException e)
                        {
                        }
                }
               
                System.out.println(Thread.currentThread().getName()+"消费"+this.name);

                //消费完毕,将标记改为false
                flag=false;
                //唤醒生产者
                notify();
        }
}


class ShengChanZhe implements Runnable
{
        private ZiYuan z;
        public ShengChanZhe(ZiYuan z)
        {
                this.z=z;
        }

        public void run()
        {
                z.set("面包");
        }
}


class XiaoFeiZhe implements Runnable
{
        private ZiYuan z;
        public XiaoFeiZhe(ZiYuan z)
        {
                this.z=z;
        }

        public void run()
        {
                z.get();
        }
}


class ShengChanXiaoFei
{
        public static void main(String[] args)
        {
                //创建资源
                ZiYuan z=new ZiYuan();
               
                //创建两个任务
                ShengChanZhe s=new ShengChanZhe(z);
                XiaoFeiZhe x=new XiaoFeiZhe(z);
               
                //创建线程
                Thread t1=new Thread(s);
                Thread t2=new Thread(x);

                t1.start();
                t2.start();

        }
}

评分

参与人数 1技术分 +1 收起 理由
贺奕凯 + 1

查看全部评分

7 个回复

倒序浏览
        public void run()
        {
            while(true)
             {
                z.get();
              }
        }
把两个重写的run()方法里面加上 while 循环,否则只执行一次线程就结束了

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
是这个程序,多生产多消费,为什么线程一直循环执行啊?

//描述资源
class ZiYuan
{
        private String name;
        private int count;
       
        //定义标记
        private boolean flag;

        //提供给商品赋值的方法
        public synchronized void set(String name)
        {
                while(flag)//判断标记为true,执行wait等待,为false,就生产
                {       
                        try
                        {
                                wait();
                        }
                        catch (InterruptedException e)
                        {
                        }
                }       
                this.name=name+"--"+count;
                count++;

                System.out.println(Thread.currentThread().getName()+"生产"+this.name);

                //生产完毕,将标记改为true
                flag=true;
                //唤醒所有等待线程
                notifyAll();
        }

   //提供获取商品的方法
        public synchronized void get()
        {
                while(!flag)
                {
                        try
                        {
                                wait();
                        }
                        catch (InterruptedException e)
                        {
                        }
                }       
                System.out.println(Thread.currentThread().getName()+"消费"+this.name);

                //消费完毕,将标记改为false
                flag=false;
                //唤醒所有等待线程
                notifyAll();
        }
}


class ShengChanZhe implements Runnable
{
        private ZiYuan z;
        public ShengChanZhe(ZiYuan z)
        {
                this.z=z;
        }

        public void run()
        {
                z.set("面包");
        }
}


class XiaoFeiZhe implements Runnable
{
        private ZiYuan z;
        public XiaoFeiZhe(ZiYuan z)
        {
                this.z=z;
        }

        public void run()
        {
                z.get();
        }
}



class ShengChanXiaoFei2
{
        public static void main(String[] args)
        {
                //创建资源
                ZiYuan z=new ZiYuan();
               
                //创建两个任务
                ShengChanZhe s=new ShengChanZhe(z);
                XiaoFeiZhe x=new XiaoFeiZhe(z);
               
                //创建线程
                Thread t0=new Thread(s);
                Thread t1=new Thread(s);
                Thread t2=new Thread(x);
                Thread t3=new Thread(x);


                t0.start();
                t1.start();
                t2.start();
                t3.start();
        }
}
回复 使用道具 举报
你这个线程也没有循环效果啊
回复 使用道具 举报
xibozglr 发表于 2013-11-29 09:46
是这个程序,多生产多消费,为什么线程一直循环执行啊?

//描述资源

Thread-0生产面包--0
Thread-2消费面包--0
Thread-1生产面包--1
Thread-3消费面包--1

就只有这4句话啊
回复 使用道具 举报
xibozglr 发表于 2013-11-29 09:46
是这个程序,多生产多消费,为什么线程一直循环执行啊?

//描述资源

你看看是不是你java XX 的时候,执行的文件写错了,或者javac的时候写错了
回复 使用道具 举报
楼主的程序两个线程 都执行完毕了啊
线程执行完毕,实际上就是线程中run()方法中的代码执行完毕,
对于线程如何循环:线程开启后,执行的是run()方法中的代码,所以线程如何循环就是看run()方法中的循环
对于楼主的程序,生产者和消费者的run()方法中都只有一句代码,并没有循环,所以当其各自的run()方法中
的代码执行完毕之后,两个线程也就执行完毕了

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
懂了,while
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马