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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© november 中级黑马   /  2014-1-16 23:35  /  1255 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

生产者消费者问题,为什么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();

        }
}

5 个回复

倒序浏览
这个问题说起来有点复杂
建议多看几遍毕老师关于线程的讲解,很详细,如果跟着毕老师的思路听下云,一定能理解
剩下的就是自己模拟了

回复 使用道具 举报
本帖最后由 月生春 于 2014-1-16 23:50 编辑

你在资源中没有设定资源的多少啊,那样肯定会一直运行下去,比如毕老师买票的例子,卖一百张票,卖掉一张就少一张,最后全部卖完!
我将代码改动一下,定义 count为100;
然后资源被占用时count就减减
class ZiYuan
{
         private String name;
         private int count=100;
         
         //定义标记
         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 MyTest3
{
         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();

}
}
回复 使用道具 举报
顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶
回复 使用道具 举报
你的两个线程 (不包括主线程) 已近执行完了,但是每个线程只执行了一次,因为线程没有循环结构,代码执行完,程序也就结束了,
回复 使用道具 举报
对楼主的代码稍加改动,加入了while循环,则每个线程执行100次结束,代码如下
  1. //package day21;
  2. class ZiYuan
  3. {
  4.          private String name;
  5.          private int count=100;
  6.          
  7.          //定义标记
  8.          private boolean flag;

  9.         //提供给商品赋值的方法
  10.          public synchronized void set(String name)
  11.          {
  12.                  while(count>0){
  13.                  if(flag)//判断标记为true,执行wait等待,为false,就生产
  14.                         
  15.                  {
  16.                          try
  17.                          {
  18.                                  wait();
  19.                          }
  20.                          catch (InterruptedException e)
  21.                          {
  22.                          }
  23.                  }
  24.                  
  25.                 this.name=name+"--"+count;
  26.                  count--;

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

  28.                 //生产完毕,将标记改为true
  29.                  flag=true;
  30.                  //唤醒消费者
  31.                  notify();
  32.                  }
  33.          }

  34.    //提供获取商品的方法
  35.          public synchronized void get()
  36.          {
  37.                  while(count>0){
  38.                  if(!flag)
  39.                  {
  40.                          try
  41.                          {
  42.                                  wait();
  43.                          }
  44.                          catch (InterruptedException e)
  45.                          {
  46.                          }
  47.                  }
  48.                  
  49.                 System.out.println(Thread.currentThread().getName()+"消费"+this.name);

  50.                 //消费完毕,将标记改为false
  51.                  flag=false;
  52.                  //唤醒生产者
  53.                  notify();
  54.                  }
  55.          }
  56. }

  57. class ShengChanZhe implements Runnable
  58. {
  59.          private ZiYuan z;
  60.          public ShengChanZhe(ZiYuan z)
  61.          {
  62.                  this.z=z;
  63.          }

  64.         public void run()
  65.          {
  66.                  z.set("面包");
  67.          }
  68. }

  69. class XiaoFeiZhe implements Runnable
  70. {
  71.          private ZiYuan z;
  72.          public XiaoFeiZhe(ZiYuan z)
  73.          {
  74.                  this.z=z;
  75.          }

  76.         public void run()
  77.          {
  78.                  z.get();
  79.          }
  80. }

  81. class MyTest3
  82. {
  83.          public static void main(String[] args)
  84.         {
  85.                  //创建资源
  86.                  ZiYuan z=new ZiYuan();
  87.                  
  88.                 //创建两个任务
  89.                  ShengChanZhe s=new ShengChanZhe(z);
  90.                  XiaoFeiZhe x=new XiaoFeiZhe(z);
  91.                  
  92.                 //创建线程
  93.                  Thread t1=new Thread(s);
  94.                  Thread t2=new Thread(x);

  95.                 t1.start();
  96.                  t2.start();

  97. }
  98. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马