一步一步认识阻塞队列

Posted 信小呆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一步一步认识阻塞队列相关的知识,希望对你有一定的参考价值。

阻塞队列是一种队列,一种可以在多线程环境下使用,并且支持阻塞等待的队列。也就是说,阻塞队列和一般的队列的区别就在于:

  1. 多线程环境支持,多个线程可以安全的访问队列
  2. 支持生产和消费等待,多个线程之间互相配合,当队列为空的时候,消费线程会阻塞等待队列不为空;当队列满了的时候,生产线 程就会阻塞直到队列不满。

如果你还没懂阻塞队列是啥,那这边在举个例子,你妈妈让你去她钱包里拿钱,可是钱包里没有钱,傻乎乎的你就一直看着钱包,啥事也不敢,就等里面有钱,或者是你妈妈让你把100块钱硬币放到钱包里,可是就塞不进去,傻乎乎的你有快开始在那里等着,等着你妈妈什么时候能够把钱包腾一些地方。~~~~太形象了,我都开始笑了。

其实就是队列满了,有个线程放不进去,或者队列空着,有个线程拿不出来。

现在使用代码实现一下

public class BlockingQueue   
      
      private List queue = new LinkedList();  
      private int  limit = 10;  
      
      public BlockingQueue(int limit)  
        this.limit = limit;  
        
      
      //添加一个一个参数,如果满了,直接wait(),如果size()为0,叫醒其他线程
      public synchronized void enqueue(Object item)  
      throws InterruptedException    
        while(this.queue.size() == this.limit)   
          wait();  
          
        if(this.queue.size() == 0)   
          notifyAll();  
          
        this.queue.add(item);  
        
      
      //删除数据正好相反
      public synchronized Object dequeue()  
      throws InterruptedException  
        while(this.queue.size() == 0)  
          wait();  
          
        if(this.queue.size() == this.limit)  
          notifyAll();  
          
      
        return this.queue.remove(0);  
        
      
      

但是这个还是有毛病的,虽然适合这个阻塞的队列,当然jdk自带的阻塞队列那么优秀,拿来直接用呗,BlockingQueue等你百度学习

以上是关于一步一步认识阻塞队列的主要内容,如果未能解决你的问题,请参考以下文章

一步一步教你认识闭包

jumpservice一步一步安装

Mybatis源码解析,一步一步从浅入深:映射代理类的获取

草根学Python(十四) 一步一步了解正则表达式

草根学Python(十四) 一步一步了解正则表达式

Vue双向绑定原理,教你一步一步实现双向绑定