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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© play1369 中级黑马   /  2014-11-27 17:22  /  1959 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. /*
  2. 生产者-消费者模式练习
  3. 用同步机制解决生产和消费信息不统一的问题
  4. 用等待与唤醒机制实现生产一个消费一个
  5. */


  6. class  PmakeCus
  7. {
  8.         public static void main(String[] args)
  9.         {
  10.                 Resouse r = new Resouse();//产品
  11.                 Make m = new Make(r);//生产者
  12.                 Customer c = new Customer(r);//消费者
  13.                 new Thread(m,"生产线程1").start();//线程
  14.                 new Thread(m,"生产线程2").start();
  15.                 new Thread(m,"生产线程3").start();
  16.                 new Thread(m,"生产线程4").start();
  17.                 new Thread(c,"消费线程1").start();
  18.                 new Thread(c,"消费线程2").start();
  19.                 new Thread(c,"消费线程3").start();
  20.                 new Thread(c,"消费线程4").start();
  21.         }
  22. }

  23. //产品类
  24. class Resouse
  25. {
  26.         private String pname;//产品名称
  27.         private int pcount = 1;//产品标识
  28.         private Boolean flag ;//等待判断标识  = false;

  29. //生产产品
  30.         public synchronized void pset(String pname)//同步生产
  31.         {
  32.                 while(flag)//已生产产品
  33.                 {
  34.                         try
  35.                         {
  36.                                 this.wait();       
  37.                         }
  38.                         catch (Exception e)
  39.                         {
  40.                                 e.printStackTrace();
  41.                         }
  42.                 }
  43.                 this.pname=pname+"--"+pcount++;
  44.                 System.out.println(Thread.currentThread().getName()+"--生产者--"+this.pname);
  45.                 flag = true;//重新设置等待标识
  46.                 this.notifyAll();//唤醒所有
  47.         }

  48. //消费产品
  49.         public synchronized void pget()//同步取出
  50.         {
  51.                 while(!flag)//已取出产品
  52.                 {
  53.                         try
  54.                         {
  55.                                 this.wait();       
  56.                         }
  57.                         catch (Exception e)
  58.                         {
  59.                                 e.printStackTrace();
  60.                         }
  61.                 }
  62.                 System.out.println(Thread.currentThread().getName()+"..消费者.."+this.pname);
  63.                 flag = false;//重新设置等待标识
  64.                 this.notifyAll();//唤醒所有               
  65.         }
  66. }

  67. //生产类
  68. class Make implements Runnable
  69. {
  70.         private Resouse r;
  71.         Boolean f = true;
  72.         Make(Resouse r)
  73.         {
  74.                 this.r=r;//接受同一产品资源
  75.         }
  76.         public void run()
  77.         {
  78.                 while(true)
  79.                 {
  80.                         if(f)
  81.                         {
  82.                                 r.pset("终结者I型");//生产不同产品
  83.                                 f=false;
  84.                         }
  85.                         else
  86.                         {
  87.                                 r.pset("终结者II型");//生产不同产品
  88.                                 f=true;
  89.                         }

  90.                 }
  91.         }
  92. }

  93. //消费类
  94. class Customer implements Runnable
  95. {
  96.         private Resouse r;
  97.         Customer(Resouse r)
  98.         {
  99.                 this.r=r;//接受同一产品资源
  100.         }
  101.         public void run()
  102.         {
  103.                 while(true)
  104.                 {
  105.                         r.pget();//取出产品
  106.                 }
  107.         }
  108. }
复制代码
Boolean flag必须附上初始值private Boolean flag = false,否则运行报空指针,为什么呢?
我记得类成员Booleand的默认值是false
类成员的话,private Boolean flag = false;和private Boolean flag;会有不同吗?

3 个回复

倒序浏览
Boolean不是8种基本类型,它是boolean的包装类,是类类型。默认初始化是null,使用之前必须引用一个对象,所以会发送空指针异常。
Boolean falg = false;编译器帮你自动装箱,相当于 Boolean  flag = new Boolean(false);
回复 使用道具 举报
kerner 发表于 2014-11-27 17:39
Boolean不是8种基本类型,它是boolean的包装类,是类类型。默认初始化是null,使用之前必须引用一个对象, ...

谢谢啊,原来写成了包装类了
回复 使用道具 举报
我就说感觉不对,基本数据类型boolean这样才对啊,,,,
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马