java实现生产者和消费者 类比消息中间件

一、对生产者消费者的理解

生产者消费者模式是并发、多线程编程中经典的设计模式。

简单来看,就是一个类负责生产,一个类负责消费。举例来说,一个变量,生产者不断增加这个变量,消费者不断减少这个变量。在互联网应用中,抢票机制就是应用了该模式,比如大麦网演唱会门票抢票,12306火车票抢票等。

二、代码演示

下面使用代码来举例理解:

有这样一个场景:

生产者:往一个公共的盒子里面放苹果
消费者:从公共的盒子里面取苹果
盒子:盒子的容量不能超过5

我们将使用wait() 和 notify() 通信方法实现

1.盒子代码

    public class PublicBox { 
       private int apple = 0;     
       public synchronized void increace() { 
           while (apple ==5) { 
               try { 
                   wait(); 
               } catch (InterruptedException e) { 
                   e.printStackTrace(); 
               } 
              
           } 
           apple++; 
           System. out .println("生成苹果成功!" );
           notify(); 
       }       
       public synchronized void decreace() { 
           while (apple ==0) { 
               try { 
                   wait(); 
               } catch (InterruptedException e) { 
                   e.printStackTrace(); 
               } 
           } 
           apple--; 
          System. out.println( "消费苹果成功!" );
           notify(); 
       } 
      
       public static void main(String []args)
          {
                 PublicBox box= new PublicBox();
                 
                 Consumer con= new Consumer(box);
                 Producer pro= new Producer(box);
                 
                 Thread t1= new Thread(con);
                 Thread t2= new Thread(pro);
                 
                 t1.start();
                 t2.start();                                       
          }
   }

2.生产者代码(定义十次)

public class Producer implements Runnable { 
    private PublicBox box; 
 
    public Producer(PublicBox box) { 
        this .box = box; 
    } 
 
    @Override 
    public void run() { 
       
        for( int i=0;i<10;i++)  
       {
               try {
                     System. out .println("pro  i:" +i);
                           Thread. sleep(30);
                     } catch (InterruptedException e) {
                            // TODO: handle exception
                           e.printStackTrace();
                     }
       
            box.increace(); 
       }
        
    } 
}

3.消费者代码(同样十次)

public class Consumer implements Runnable { 
    private PublicBox box; 
 
    public Consumer(PublicBox box) { 
        this .box = box; 
    } 
 
    @Override 
    public void run() { 
       
        for( int i=0;i<10;i++)
       {
             try {
                     System. out .println("Con: i " +i);
                           Thread. sleep(3000);                // 这里设置跟上面30不同是为了 盒子中的苹果能够增加,不会生产一个马上被消费  
                     } catch (InterruptedException e) {
                            // TODO: handle exception
                           e.printStackTrace();
                     }
       
              box.decreace(); 
        } 
     } 
}

4.输出如下:

pro i:0
Con: i 0
生成苹果成功!
pro i:1
生成苹果成功!
pro i:2
生成苹果成功!
pro i:3
生成苹果成功!
pro i:4
生成苹果成功!
pro i:5
消费苹果成功!
Con: i 1
生成苹果成功!
pro i:6
消费苹果成功!
Con: i 2
生成苹果成功!
pro i:7
消费苹果成功!
生成苹果成功!
pro i:8
Con: i 3
消费苹果成功!
生成苹果成功!
pro i:9
Con: i 4
消费苹果成功!
生成苹果成功!
Con: i 5
消费苹果成功!
Con: i 6
消费苹果成功!
Con: i 7
消费苹果成功!
Con: i 8
消费苹果成功!
Con: i 9
消费苹果成功!
这个只是简单地从线程的wait、nofity来实现生产者和消费者模式。目前比较流行的是使用消息队列的方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

残雪飞扬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值