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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 小泽 中级黑马   /  2015-5-29 21:18  /  431 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. package com.qianfeng.test;

  2. import java.util.Comparator;
  3. import java.util.Random;
  4. import java.util.TreeSet;

  5. /**
  6. * 题是我自己想的
  7. *
  8. * 一个工厂由多个生产者组成,每一天生产随机数目的产品,(由于天气等不可抗拒因素)
  9. * 由多个商店负责销售这些产品,也是随机销售产品数目(由于天气,消费者心情,是不是周末等因素),但不能超过库存
  10. * 销售必须从先生产的产品开始
  11. *
  12. *
  13. * @author Administrator
  14. *
  15. */

  16. /**
  17. * 比较器用来使产品不重复
  18. *
  19. * @author Administrator
  20. *
  21. */
  22. class ComByProduceNumber implements Comparator<Produce> {

  23.         @Override
  24.         public int compare(Produce o1, Produce o2) {
  25.                 // TODO Auto-generated method stub
  26.                 return o1.getProduceNumber().compareTo(o2.getProduceNumber());
  27.         }
  28. }

  29. /**
  30. * 仓库类
  31. *
  32. * @author Administrator
  33. *
  34. */
  35. class Warehouse {
  36.         // 定义集合用来装产品
  37.         private TreeSet<Produce> ts = new TreeSet<Produce>(new ComByProduceNumber());
  38.         // 定义一个标记
  39.         private boolean flag;
  40.        

  41.         public boolean isFlag() {
  42.                 return flag;
  43.         }

  44.         public void setFlag(boolean flag) {
  45.                 this.flag = flag;
  46.         }

  47.         public void add(Produce produce) {
  48.                 ts.add(produce);
  49.         }

  50.         public Produce get() {
  51.                 return ts.pollFirst();
  52.         }

  53. }

  54. /**
  55. * 产品类
  56. *
  57. * @author Administrator
  58. *
  59. */
  60. class Produce {
  61.         // 品名
  62.         private String produceName;
  63.         // 编号,从0开始
  64.         private static int count;
  65.         // 产品系列
  66.         private String series;
  67.         // 产品序列号 由产品系列加产品编号组成
  68.         private String ProduceNumber;

  69.         public String getProduceName() {
  70.                 return produceName;
  71.         }

  72.         public void setProduceName(String produceName) {
  73.                 this.produceName = produceName;
  74.         }

  75.         public int getCount() {
  76.                 return count;
  77.         }

  78.         public void setCount(int count) {
  79.                 Produce.count = count;
  80.         }

  81.         public String getSeries() {
  82.                 return series;
  83.         }

  84.         public void setSeries(String series) {
  85.                 this.series = series;
  86.         }

  87.         public String getProduceNumber() {
  88.                 return ProduceNumber;
  89.         }

  90.         public void setProduceNumber(String produceNumber) {
  91.                 ProduceNumber = produceNumber;
  92.         }

  93.         public Produce(String produceName, String series) {
  94.                 super();
  95.                 this.produceName = produceName;
  96.                 this.series = series;
  97.                 ++count;
  98.                 ProduceNumber = series + (10000 + count);
  99.         }
  100. }

  101. /**
  102. * http://v.yinyuetai.com/video/325227 工厂类
  103. */
  104. class Factory implements Runnable {
  105.         private Warehouse warehouse;
  106.        
  107.        
  108.         public Factory(Warehouse warehouse) {
  109.                 super();
  110.                 this.warehouse = warehouse;
  111.         }

  112.         // 随机生产的产品是数目
  113.         private int yield;

  114.         // 生产方法
  115.         public void prodoce() {
  116.                 if (warehouse.isFlag()) {
  117.                         try {
  118.                                 warehouse.wait();
  119.                         } catch (InterruptedException e) {
  120.                                 // TODO Auto-generated catch block
  121.                                 e.printStackTrace();
  122.                         }
  123.                 }
  124.                 synchronized (warehouse) {
  125.                         yield = new Random().nextInt(20);
  126.                         for (int i = 1; i <= yield; i++) {
  127.                                 Produce produce = new Produce("Lenovo游戏影音本", "-LX-Y");
  128.                                 warehouse.add(produce);
  129.                                 System.out.println(Thread.currentThread().getName() + ":"
  130.                                                 + produce.getProduceName() + produce.getProduceNumber()
  131.                                                 + "已入库");
  132.                         }
  133.                         try {
  134.                                 Thread.sleep(1000);
  135.                         } catch (InterruptedException e) {
  136.                                 // TODO Auto-generated catch block
  137.                                 e.printStackTrace();
  138.                         }
  139.                         warehouse.notify();
  140.                         warehouse.setFlag(true);
  141.                 }

  142.         }

  143.         @Override
  144.         public void run() {
  145.                 // TODO Auto-generated method stub
  146.                 while (true) {
  147.                         prodoce();
  148.                 }
  149.         }

  150. }

  151. class DirectSaleStore implements Runnable {
  152.         private Warehouse warehouse;
  153.        
  154.         // 随机卖出的产品数目
  155.         private int sale;
  156.        
  157.        
  158.         public DirectSaleStore(Warehouse warehouse) {
  159.                 super();
  160.                 this.warehouse = warehouse;
  161.         }

  162.         // 销售方法
  163.         public void sale() {
  164.                 if (!warehouse.isFlag()) {
  165.                         try {
  166.                                 warehouse.wait();
  167.                         } catch (InterruptedException e) {
  168.                                 // TODO Auto-generated catch block
  169.                                 e.printStackTrace();
  170.                         }
  171.                 }
  172.                 synchronized (warehouse) {
  173.                         sale = new Random().nextInt(30);
  174.                         for (int i = 1; i <= sale; i++) {
  175.                                 Produce produce = warehouse.get();
  176.                                 if (produce == null) {
  177.                                         System.out.println("已售完!!!");
  178.                                         break;
  179.                                 }
  180.                                 System.out.println(Thread.currentThread().getName() + ":"
  181.                                                 + produce.getProduceName() + produce.getProduceNumber()
  182.                                                 + "已卖出");
  183.                         }
  184.                         warehouse.setFlag(false);
  185.                         warehouse.notify();
  186.                 }
  187.         }

  188.         @Override
  189.         public void run() {
  190.                 // TODO Auto-generated method stub
  191.                 while (true) {
  192.                         sale();
  193.                 }
  194.         }

  195. }

  196. public class Test6 {

  197.         /**
  198.          * @param args
  199.          */
  200.         public static void main(String[] args) {
  201.                 // TODO Auto-generated method stub

  202.                 Warehouse warehouse = new Warehouse();
  203.                
  204.                 Factory line1 = new Factory(warehouse);

  205.                 DirectSaleStore store1 = new DirectSaleStore(warehouse);

  206.                 Thread t1 = new Thread(line1, "生产线1");
  207.                 Thread t2 = new Thread(store1, "直营店1");

  208.                 t1.start();
  209.                 t2.start();
  210.         }

  211. }
复制代码

2 个回复

正序浏览
这是运行结果

Exception in thread "直营店1" java.lang.IllegalMonitorStateException
        at java.lang.Object.wait(Native Method)
        at java.lang.Object.wait(Object.java:502)
        at com.qianfeng.test.DirectSaleStore.sale(Test6.java:194)
        at com.qianfeng.test.DirectSaleStore.run(Test6.java:221)
        at java.lang.Thread.run(Thread.java:745)
生产线1:Lenovo游戏影音本-LX-Y10001已入库
生产线1:Lenovo游戏影音本-LX-Y10002已入库
生产线1:Lenovo游戏影音本-LX-Y10003已入库
生产线1:Lenovo游戏影音本-LX-Y10004已入库
生产线1:Lenovo游戏影音本-LX-Y10005已入库
生产线1:Lenovo游戏影音本-LX-Y10006已入库
生产线1:Lenovo游戏影音本-LX-Y10007已入库
生产线1:Lenovo游戏影音本-LX-Y10008已入库
生产线1:Lenovo游戏影音本-LX-Y10009已入库
生产线1:Lenovo游戏影音本-LX-Y10010已入库
生产线1:Lenovo游戏影音本-LX-Y10011已入库
生产线1:Lenovo游戏影音本-LX-Y10012已入库
生产线1:Lenovo游戏影音本-LX-Y10013已入库
生产线1:Lenovo游戏影音本-LX-Y10014已入库
生产线1:Lenovo游戏影音本-LX-Y10015已入库
Exception in thread "生产线1" java.lang.IllegalMonitorStateException
        at java.lang.Object.wait(Native Method)
        at java.lang.Object.wait(Object.java:502)
        at com.qianfeng.test.Factory.prodoce(Test6.java:141)
        at com.qianfeng.test.Factory.run(Test6.java:172)
        at java.lang.Thread.run(Thread.java:745)
回复 使用道具 举报
智能顶贴机制已启动.....................
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马