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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 as604049322 于 2014-12-25 17:38 编辑

看完毕老师的多线程视频,自己写的第三个源码。
运行效果截图:

  1. /*
  2. 需求分析:有一群生产者和一群消费者,
  3. 生产的商品都由一个对象来保存,生产者生产时,消费者不得进行购买动作,生产完成后才可以进行购买
  4. 同样消费者购买商品时生产者不得生产。
  5. */

  6. class ProducerConsumer
  7. {
  8.     public static void main(String[] args)
  9.     {
  10.         Resource r=new Resource();
  11.         Producer p=new Producer(r);
  12.         Consumer c=new Consumer(r);
  13.         new Thread(p,"生产者1").start();
  14.         new Thread(p,"生产者2").start();
  15.         new Thread(p,"生产者3").start();
  16.         new Thread(c,"消费者1").start();
  17.         new Thread(c,"消费者2").start();
  18.         new Thread(c,"消费者3").start();
  19.         new Thread(c,"消费者4").start();
  20.         new Thread(c,"消费者5").start();
  21.     }
  22. }
  23. class Resource
  24. {
  25.     String name;
  26.     int count;
  27.     boolean flag=false;
  28.     public synchronized void produce(String name){
  29.         while(flag)
  30.             try{wait();}catch(Exception e){}
  31.         this.name=name;
  32.         System.out.println(Thread.currentThread().getName()+":生产一个商品,信息如下:");
  33.         System.out.println("产品名称:"+name+",产品编号:"+(++count));
  34.         System.out.println("-----------------------------------------------------");
  35.         flag=true;
  36.         notifyAll();
  37.     }
  38.     public synchronized void consume(){
  39.          while(!flag)
  40.             try{wait();}catch(Exception e){}
  41.         System.out.println(Thread.currentThread().getName()+":某个商品被购买,信息如下:");
  42.         System.out.println("产品名称:"+name+",产品编号为:"+count);
  43.         System.out.println("-----------------------------------------------------");
  44.         flag=false;
  45.         notifyAll();
  46.     }
  47. }
  48. class Producer implements Runnable
  49. {
  50.     private final Resource r;
  51.     Producer(Resource r){
  52.         this.r=r;
  53.     }
  54.     public void run(){
  55.         while(true)
  56.             r.produce(creatRandomName());
  57.     }
  58.     public static String creatRandomName(){
  59.         String[] name={"加饭酒","茅台酒","21金维他","两面针","牙膏","电视机","计算机","桌子","衣服"};
  60.         return name[(int)(Math.random()*name.length)];
  61.     }
  62. }
  63. class Consumer implements Runnable
  64. {
  65.     private final Resource r;
  66.     Consumer(Resource r){
  67.         this.r=r;
  68.     }
  69.     public void run(){
  70.         while(true)
  71.             r.consume();
  72.     }
  73. }
复制代码

评分

参与人数 1技术分 +6 收起 理由
lwj123 + 6 加油!

查看全部评分

9 个回复

倒序浏览
本帖最后由 as604049322 于 2014-12-25 16:42 编辑

JDK1.5 的升级版

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

  2. class ProducerConsumer2
  3. {
  4.     public static void main(String[] args)
  5.     {
  6.         Resource r=new Resource();
  7.         Producer p=new Producer(r);
  8.         Consumer c=new Consumer(r);
  9.         new Thread(p,"生产者1").start();
  10.         new Thread(p,"生产者2").start();
  11.         new Thread(p,"生产者3").start();
  12.         new Thread(c,"消费者1").start();
  13.         new Thread(c,"消费者2").start();
  14.         new Thread(c,"消费者3").start();
  15.         new Thread(c,"消费者4").start();
  16.         new Thread(c,"消费者5").start();
  17.     }
  18. }
  19. class Resource
  20. {
  21.     String name;
  22.     int count;
  23.     boolean flag=false;
  24.     private Lock lock=new ReentrantLock();
  25.     private Condition pro=lock.newCondition();
  26.     private Condition con=lock.newCondition();
  27.     public void produce(String name) throws InterruptedException {
  28.         lock.lock();
  29.         try{
  30.             while(flag)
  31.                 pro.await();
  32.             this.name=name;
  33.             System.out.println(Thread.currentThread().getName()+":生产一个商品,信息如下:");
  34.             System.out.println("产品名称:"+name+",产品编号:"+(++count));
  35.             System.out.println("-----------------------------------------------------");
  36.             flag=true;
  37.             con.signal();
  38.         }finally{
  39.             lock.unlock();
  40.         }
  41.     }
  42.     public void consume() throws InterruptedException {
  43.         lock.lock();
  44.         try{
  45.             while(!flag)
  46.                 con.await();
  47.             System.out.println(Thread.currentThread().getName()+":某个商品被购买,信息如下:");
  48.             System.out.println("产品名称:"+name+",产品编号为:"+count);
  49.             System.out.println("-----------------------------------------------------");
  50.             flag=false;
  51.             pro.signal();
  52.         }finally{
  53.              lock.unlock();
  54.         }
  55.     }
  56. }
  57. class Producer implements Runnable
  58. {
  59.     private final Resource r;
  60.     Producer(Resource r){
  61.         this.r=r;
  62.     }
  63.     public void run(){
  64.         while(true){
  65.             try{
  66.                 r.produce(creatRandomName());
  67.             }catch (InterruptedException e){
  68.                 e.toString();
  69.             }
  70.         }
  71.     }
  72.     public static String creatRandomName(){
  73.         String[] name={"加饭酒","茅台酒","21金维他","两面针","牙膏","电视机","计算机","桌子","衣服"};
  74.         return name[(int)(Math.random()*name.length)];
  75.     }
  76. }
  77. class Consumer implements Runnable
  78. {
  79.     private final Resource r;
  80.     Consumer(Resource r){
  81.         this.r=r;
  82.     }
  83.     public void run(){
  84.         while(true){
  85.             try{
  86.                 r.consume();
  87.             }catch (InterruptedException e){
  88.                 e.toString();
  89.             }
  90.         }
  91.     }
  92. }
复制代码
回复 使用道具 举报
。。。。。。。。。。
回复 使用道具 举报
大神第几期的?
回复 使用道具 举报
本帖最后由 as604049322 于 2014-12-25 17:35 编辑

占楼,用于升级资源。之前一个资源只能放一个商品,现在升级到可以放100个商品。。。请等待楼主升级……
已经成功升级,代码如下:
  1. import java.util.concurrent.locks.*;

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

回复 使用道具 举报

我是菜鸟。。想上55期,,,现在这个速度估计指望不上了
回复 使用道具 举报
再占一楼,,,便于以后再次升级。。。
回复 使用道具 举报
as604049322 发表于 2014-12-25 16:44
我是菜鸟。。想上55期,,,现在这个速度估计指望不上了

我也是哎。。。
回复 使用道具 举报
不是跟毕老师一样的吗!!
回复 使用道具 举报
abc784990536 发表于 2014-12-26 11:00
不是跟毕老师一样的吗!!

看第四楼,或者看
http://bbs.itheima.com/forum.php ... p;page=1#pid1144994
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马