数据结构与算法(队列)

上节课我们讲到了循环队列,今天我们来用java实现一下循环队列的代码 

 在写代码之前,我们先来看看循环在队列满和队列空的情况下应该满足什么样子的条件

   

 由

图中可以看出,当队列中的数据是空时,此时的条件是head =tail,当队列中的数据是满的,满足的条件应该是(tail +1) %n =head

public class Queue{
  public String[] items;
  public int n;
  public tail = 0;
  public head = 0;
public Queue(int capacity){
    items = new String[capacity]
    n=capacity;
 
}
//入队列操作
public boolean push(String str){
   if((tail+1)%n = head) return fasle;//队列已经满了,返回false
   items[tail] = str;
   tail =(tail +1) % n ;
   return true;

}
public String pop(){
if(head == tail) return null;
String str = items[head]
head = (head+1) % n
return str;
}
   
  
}

2>现在我们来讲一将阻塞队列和并发队列

       所谓阻塞队列其实就在队列的基础上增加了阻塞的作用,当队列中的数据为空的时候,有个请求取数据,阻塞这个请求,当一个队列为满的时候,往这个队列插入队列,阻塞这个请求.这点逻辑有点像我们的生产者-消费者模型

解说:由图中可以看出,队头最为数据的消费者,队尾做为数据的生产者,当生产者的生产数据速率远远大于消费者的消费速率,队列中就会积累大量的数据,当空间已经满的时候,阻塞生产者的请求,,为保证消费者与生产者达到平衡,生产者生产速率=消费者消费速率,另一个方法是配置多个消费者(消费组),且每个消费者保证线程安全,者就是并发队列.

        解释:为保证并发队列中的安全机制,我们应该在并发队列方法出队和入队加入锁机制或者同步方法,保证同一时刻只有一个线程去读和写.

 总结:在队列这一应用中,最常见的就是阻塞队列,我们在进行资源的申请,线程池,数据库连接池经常用到,当一个请求需要线程或者资源的时候,线程资源不足,将这个请求进行阻塞.来达到平衡.但也要保证阻塞的请求能在接受的范围内.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值