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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 as604049322 于 2014-12-25 21:30 编辑

问题描述:有一个大型商场,该商场拥有4个超级商店和6个超级生产机器人和一个能存货300个商品的仓库
4个超级商店24小时营业不停运
6个超级生产机器人编号为1~6,编号为1~3的生产机器人和编号为4~6的生产机器人轮流生产商品
轮流间隔为1秒钟。生产的商品是编号唯一,名称随机的。
每隔5秒钟,6个超级生产机器人全部停止生产,并进行检修,时间为20秒
20秒之后,6个超级生产机器人继续进行间隔高速生产商品
而4个超级商店一直在从仓库中取商品,并卖出。
----------------------------------------------------------
运行截图:

  1. import java.util.concurrent.locks.*;

  2. class ProducerConsumer4
  3. {
  4.     public static void main(String[] args)
  5.     {
  6.         Resource r=new Resource();
  7.         Producer p1=new Producer("超级生产机器人1",r);
  8.         Producer p2=new Producer("超级生产机器人2",r);
  9.         Producer p3=new Producer("超级生产机器人3",r);
  10.         Producer p4=new Producer("超级生产机器人4",r);
  11.         Producer p5=new Producer("超级生产机器人5",r);
  12.         Producer p6=new Producer("超级生产机器人6",r);
  13.         Consumer c=new Consumer(r);
  14.         p4.work();
  15.         p5.work();
  16.         p6.work();
  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.         int count=0;
  22.         while(true){
  23.             p4.over();
  24.             p5.over();
  25.             p6.over();
  26.             p1.work();
  27.             p2.work();
  28.             p3.work();
  29.             try{Thread.sleep(1000);}catch(Exception e){}
  30.             p1.over();
  31.             p2.over();
  32.             p3.over();
  33.             p4.work();
  34.             p5.work();
  35.             p6.work();
  36.             count=(count+1)%10;
  37.             if(count==5){
  38.                 p1.over();
  39.                 p2.over();
  40.                 p3.over();
  41.                 p4.over();
  42.                 p5.over();
  43.                 p6.over();
  44.                 try{Thread.sleep(20000);}catch(Exception e){}
  45.             }
  46.         }
  47.     }
  48. }
  49. class commodity
  50. {
  51.     String name;//产品名称
  52.     int number;//产品编号
  53.     commodity(int num){
  54.         this.name=creatRandomName();
  55.         this.number=num;
  56.     }
  57.     public static String creatRandomName(){
  58.         String[] name={"茶杯","茅台酒","21金维他","两面针","牙膏","电视机","计算机","桌子","衣服"};
  59.         return name[(int)(Math.random()*name.length)];
  60.     }
  61. }
  62. class Resource
  63. {
  64.     final commodity[] storehouse = new commodity[100];//仓库中的保存的货物
  65.     int total;//仓库中当前的货物总数
  66.     int proPointer;//生产者当前指针
  67.     int conPointer;//消费者当前指针
  68.    
  69.     int count;//产品编号
  70.     private Lock lock=new ReentrantLock();
  71.     private Condition pro=lock.newCondition();
  72.     private Condition con=lock.newCondition();
  73.     public void produce() throws InterruptedException {
  74.         lock.lock();
  75.         try{
  76.             while(total==storehouse.length)
  77.                 pro.await();
  78.             storehouse[proPointer]=new commodity(count++);
  79.             System.out.println(Thread.currentThread().getName()+":生产一个商品,信息如下:");
  80.             System.out.println("产品名称:"+storehouse[proPointer].name+",产品编号:"+storehouse[proPointer].number);
  81.             System.out.println("-----------------------------------------------------");
  82.             proPointer=(proPointer+1)%storehouse.length;
  83.             ++total;
  84.             con.signal();
  85.         }finally{
  86.             lock.unlock();
  87.         }
  88.     }
  89.     public void consume() throws InterruptedException {
  90.         lock.lock();
  91.         try{
  92.             while(total==0)
  93.                 con.await();
  94.             commodity temp=storehouse[conPointer];
  95.             conPointer=(conPointer+1)%storehouse.length;
  96.             --total;
  97.             System.out.println(Thread.currentThread().getName()+":某个商品被购买,信息如下:");
  98.             System.out.println("产品名称:"+temp.name+",产品编号为:"+temp.number);
  99.             System.out.println("-----------------------------------------------------");
  100.             pro.signal();
  101.         }finally{
  102.              lock.unlock();
  103.         }
  104.     }
  105. }
  106. class Producer
  107. {
  108.     private final Resource r;
  109.     private boolean flag;
  110.     private final String name;
  111.     private Thread t;
  112.     Producer(String name,Resource r){
  113.         this.name=name;
  114.         this.r=r;
  115.     }

  116.     public void work(){
  117.         flag=true;
  118.         t=new Thread(name){
  119.             public void run(){
  120.                 while(flag){
  121.                     try{
  122.                         r.produce();
  123.                     }catch (InterruptedException e){
  124.                         System.out.println(Thread.currentThread().getName()+":我休息1秒钟");
  125.                     }
  126.                 }
  127.             }
  128.         };
  129.         t.start();
  130.     }
  131.     public void over(){
  132.         flag=false;
  133.         t.interrupt();
  134.     }
  135. }
  136. class Consumer implements Runnable
  137. {
  138.     private final Resource r;
  139.     Consumer(Resource r){
  140.         this.r=r;
  141.     }
  142.     public void run(){
  143.         while(true){
  144.             try{
  145.                 r.consume();
  146.             }catch (InterruptedException e){
  147.                 e.toString();
  148.             }
  149.         }
  150.     }
  151. }
复制代码

评分

参与人数 1技术分 +2 收起 理由
王震阳老师 + 2 很给力!

查看全部评分

4 个回复

倒序浏览
很给力,今天晚上太晚了,没时间仔细看了,不过我下一期的技术分活动就是多线程。在我的题目中是有预告的。
回复 使用道具 举报
本帖最后由 as604049322 于 2014-12-26 10:43 编辑
王震阳老师 发表于 2014-12-26 00:29
很给力,今天晚上太晚了,没时间仔细看了,不过我下一期的技术分活动就是多线程。在我的题目中是有预告的。 ...

难得得到老师的认可:lol,今天起床又稍微作了一点改进。细节问题还望王老师指导一下。
运行效果:

代码如下:
  1. import java.util.concurrent.locks.*;

  2. class ProducerConsumer4
  3. {
  4.     public static void main(String[] args)
  5.     {
  6.         Resource r=new Resource();
  7.         Producer p1=new Producer("超级生产机器人1",r);
  8.         Producer p2=new Producer("超级生产机器人2",r);
  9.         Producer p3=new Producer("超级生产机器人3",r);
  10.         Producer p4=new Producer("超级生产机器人4",r);
  11.         Producer p5=new Producer("超级生产机器人5",r);
  12.         Producer p6=new Producer("超级生产机器人6",r);
  13.         Consumer c=new Consumer(r);
  14.         p4.work();
  15.         p5.work();
  16.         p6.work();
  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.         int count=0;
  22.         while(true){
  23.             p4.over();
  24.             p5.over();
  25.             p6.over();
  26.             p1.work();
  27.             p2.work();
  28.             p3.work();
  29.             try{Thread.sleep(1000);}catch(Exception e){}
  30.             p1.over();
  31.             p2.over();
  32.             p3.over();
  33.             p4.work();
  34.             p5.work();
  35.             p6.work();
  36.             count=(count+1)%10;
  37.             if(count==5){
  38.                 p1.over();
  39.                 p2.over();
  40.                 p3.over();
  41.                 p4.over();
  42.                 p5.over();
  43.                 p6.over();
  44.                 System.out.println("<-----所有机器人集体休息20秒------>");
  45.                 try{Thread.sleep(20000);}catch(Exception e){}
  46.             }
  47.         }
  48.     }
  49. }
  50. class commodity
  51. {
  52.     String name;//产品名称
  53.     int number;//产品编号
  54.     commodity(int num){
  55.         this.name=creatRandomName();
  56.         this.number=num;
  57.     }
  58.     public static String creatRandomName(){
  59.         String[] name={"茶杯","茅台酒","21金维他","两面针","牙膏","电视机","计算机","桌子","衣服"};
  60.         return name[(int)(Math.random()*name.length)];
  61.     }
  62. }
  63. class Resource
  64. {
  65.     final commodity[] storehouse = new commodity[100];//仓库中的保存的货物
  66.     int total;//仓库中当前的货物总数
  67.     int proPointer;//生产者当前指针
  68.     int conPointer;//消费者当前指针
  69.    
  70.     int count;//产品编号
  71.     private Lock lock=new ReentrantLock();
  72.     private Condition pro=lock.newCondition();
  73.     private Condition con=lock.newCondition();
  74.     public void produce() throws InterruptedException {
  75.         lock.lock();
  76.         try{
  77.             while(total==storehouse.length)
  78.                 pro.await();
  79.             storehouse[proPointer]=new commodity(count++);
  80.             System.out.println(Thread.currentThread().getName()+":生产一个商品,信息如下:");
  81.             System.out.println("产品名称:"+storehouse[proPointer].name+";产品编号:"+storehouse[proPointer].number);
  82.             System.out.println("-----------------------------------------------------");
  83.             proPointer=(proPointer+1)%storehouse.length;
  84.             ++total;
  85.             con.signal();
  86.         }finally{
  87.             lock.unlock();
  88.         }
  89.     }
  90.     public void consume() throws InterruptedException {
  91.         lock.lock();
  92.         try{
  93.             while(total==0)
  94.                 con.await();
  95.             commodity temp=storehouse[conPointer];
  96.             conPointer=(conPointer+1)%storehouse.length;
  97.             --total;
  98.             System.out.println(Thread.currentThread().getName()+":某个商品被购买,信息如下:");
  99.             System.out.println("产品名称:"+temp.name+";产品编号为:"+temp.number);
  100.             System.out.println("购买人信息:");
  101.             System.out.println("姓名:"+person.getName()+";性别:"+person.getSex());
  102.             System.out.println("手机号:"+person.getCellphoneNumber());
  103.             System.out.println("-----------------------------------------------------");
  104.             pro.signal();
  105.         }finally{
  106.              lock.unlock();
  107.         }
  108.     }
  109. }
  110. class person
  111. {
  112.     public static final String[] firstName={"王","李","张","刘", "陈","杨","黄","赵", "周","吴","徐","孙", "马","胡","朱","郭", "何","罗","高","林",
  113.                             "郑","梁","谢","唐", "许","冯","宋","韩", "邓","彭","曹","曾", "田","于","肖","潘", "袁","董","叶","杜",
  114.                             "丁","蒋","程","余", "吕","魏","蔡","苏", "任","卢","沈","姜", "姚","钟","崔","陆", "谭","汪","石","付",
  115.                             "贾","范","金","方", "韦","夏","廖","侯", "白","孟","邹","秦", "尹","江","熊","薛", "邱","闫","段","雷",
  116.                             "季","史","陶","毛", "贺","龙","万","顾", "关","郝","孔","向", "龚","邵","钱","武", "扬","黎","汤","戴",
  117.                             "严","文","常","牛", "莫","洪","米","康", "温","代","赖","施"};
  118.     public static final String[] lastName={"振","旦","云","祥","哲","欣","华","彦","淇","华","梓","刚","洋","煜","霖","键"
  119.                             "利","培","欣","宇","俊","泊","政","文","杰","海","泽","泊","鑫","晖","子","硕","霖","鑫","培",
  120.                             "智","生","明","鑫","子","哲","键","强","刚","键","子","杰","杰","成","铠","兰","霖","霖","灏"
  121.                             "泉","泉","新","锋","瑞","翔","纯","鸿","益","睿","厚","晖","超","曦","智","博","智","杰","彦",
  122.                             "翔","轩","泉","文","慧","瑞","祺","君","明","思","煜","铠","欣","梓","智","嵘","欣","洁","程",
  123.                             "昌","咏","明","宝","祺","函","龙","宇","明","存","政","奕","梓","鑫","柔","方","霖","朕","嵘",
  124.                             "松","鑫","咏","欣","睿","铭","海","霖","彦","泽","霖","宇","翌","子","政","明","佳","铠","明",
  125.                             "富","明","柔","程","彦","汪","英","鑫","祺","宇","杰","汪","刚","金","桂","晏","嵘","宝","正",
  126.                             "子","超","梓","洋","欣","晖","凯","兰","洋","文","霖","继","昌","君","彤","欣","华","奕","圩"
  127.                             "文","晏","君","泽","柔","利","函","文","星","正","功","茂","雪","明","成","松","瑞","厚","宇",
  128.                             "杰","泽","晔","嘉","泽","阳","俊","堇","存","铭","思","宇","杰","希","鑫","键","明","希","韬",
  129.                             "欣","智","思","鑫","阳","鑫","彦","华","铠","豪","成","明","文","旻","嘉","旻","政","新","泰",
  130.                             "存","荣","益","金","锋","鑫","俊","振","永","滨","君","智","博","杰","晔","子","文","瑞","晖",
  131.                             "振","君","程","祺","炎","睿","政","晔","锦","佳","宇"};
  132.     public static String getName(){
  133.         String name=firstName[(int)(Math.random()*112)]+lastName[(int)(Math.random()*lastName.length)];
  134.         if((int)(Math.random()*2)==0)
  135.             name+=lastName[(int)(Math.random()*lastName.length)];
  136.         if((int)(Math.random()*20)==5)
  137.             name+=lastName[(int)(Math.random()*lastName.length)];
  138.         return name;
  139.     }
  140.     public static String getSex(){
  141.         if((int)(Math.random()*2)==1)
  142.             return "男";
  143.         else
  144.             return "女";
  145.     }
  146.     public static String getCellphoneNumber(){
  147.         String[] firstNumber={"134","135"," 136","137","138","139","150","151","152","157","158","159","187","188",//移到
  148.             "130","131","132","155","156","185","186",//联通
  149.             "133","153","180","189"};//电信
  150.         return firstNumber[(int)(Math.random()*firstNumber.length)]+(int)(Math.random()*9000+1000)+(int)(Math.random()*9000+1000);
  151.     }
  152. }
  153. class Producer
  154. {
  155.     private final Resource r;
  156.     private boolean flag;
  157.     private final String name;
  158.     private Thread t;
  159.     Producer(String name,Resource r){
  160.         this.name=name;
  161.         this.r=r;
  162.     }

  163.     public void work(){
  164.         flag=true;
  165.         t=new Thread(name){
  166.             public void run(){
  167.                 while(flag){
  168.                     try{
  169.                         r.produce();
  170.                     }catch (InterruptedException e){
  171.                         System.out.println(Thread.currentThread().getName()+":发生中断异常");
  172.                     }
  173.                 }
  174.                 System.out.println(Thread.currentThread().getName()+":我休息1秒钟");
  175.                 System.out.println("-----------------------------------------------------");
  176.             }
  177.         };
  178.         t.setPriority(Thread.MIN_PRIORITY);
  179.         t.start();
  180.     }
  181.     public void over(){
  182.         flag=false;
  183.         t.interrupt();
  184.     }
  185. }
  186. class Consumer implements Runnable
  187. {
  188.     private final Resource r;
  189.     Consumer(Resource r){
  190.         this.r=r;
  191.     }
  192.     public void run(){
  193.         while(true){
  194.             try{
  195.                 r.consume();
  196.             }catch (InterruptedException e){
  197.                 e.toString();
  198.             }
  199.         }
  200.     }
  201. }
复制代码

更多图片 小图 大图
组图打开中,请稍候......
回复 使用道具 举报
哇楼主列害啊,佩服佩服
回复 使用道具 举报
希望你学完了课程还能记得这么清楚
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马