Queue

在并发队列上JDK提供了两套实现,一个是以ConcurrentLinkedQueue为代表的高性能队列,一个是以BlockingQueue接口为代表的阻塞队列,无论哪种都继承自Queue。如下图所示。

ConcurrentLinkedQueue:是一个适用于高并发场景下的队列,通过无锁的方式,实现了高并发状态下的高性能,通常ConcurrentLinkedQueue性能好于BlockingQueue。它是一个基于链接节点的无界线程安全队列。该队列的元素遵循先进先出的原则。头是最先加入的,尾是最近加入的,该队列不允许null元素。

ConcurrentLinkedQueue中的方法:
       添加元素: add()和offer()都是加入元素的方法(在ConcurrentLinkedQueue中,两个方法是没有区别的,这是因为这两个方法都继承自父类Queue,在其它场景下是可能不一样的)
       取元素: poll()和peek()都是取头元素节点,区别在于前者会删除元素,后者不会。

 

ArrayBlockingQueue:有界阻塞队列。
重要方法:add(),put(),offer();

当队列已满时

add():不能马上添加时,返回异常IllegalStateException,成功时返回ture

put():如果不能添加,一直在running,直到能添加为止

offer():成功返回ture,失败返回false

 

LinkedBlockingQueue 指定长度就是有界,不指定就是无界的阻塞队列

其中q.drainTo(list,3)是一次性把队列中的三个元素都存放到list当中,返回值是成功从队列中取出的元素个数。我们说LinkedBlockingQueue是无界队列是因为我们可以不设置队列的长度,这样队列便是无界的。

       但是如果给LinkedBlockingQueue指定长度的话,它就变成了有界队列,比如我们把LinkedBlockingQueue的长度设置为5,超出队列的话,将无法再添加元素,如下图所示。

          运行结果如下图所示,q.offer()方法如果返回true表示添加成功,返回false表示添加失败。可见第6个元素并没有成功添加。

 

SynchronousQueue    这个队列它不能装任何元素。

下面看个例子,这个例子,貌似SynchronousQueue可以添加元素,如下所示。但是其实SynchronousQueue依然是没有存储元素的,这里之所以没有报错,是因为我们先启动了一个线程t1要消费SynchronousQueue这个队列中的元素,线程t2要向SynchronousQueue队列添加一个元素,这时候会发生什么呢?这时候,线程t2并不会真的把元素添加到队列中,而是直接将要添加的元素交给线程t1了。也就是说,SynchronousQueue队列还是不会真正存储元素的。

package com.internet.queue;
 
import java.util.concurrent.SynchronousQueue;
 
public class UseQueue {
   public static void main(String[] args) {
	  final SynchronousQueue<String> q = new SynchronousQueue<String>();
	  Thread t1 = new Thread(new Runnable() {
		
			@Override
			public void run() {
				try {
					System.out.println(q.take());
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
	   });
	   t1.start();
	   Thread t2 = new Thread(new Runnable() {
		
			@Override
			public void run() {
				q.add("ffasss");
			}
		});
	    t2.start();
   }
}

应用场景是资源比较充裕时,不需要削峰等策略,直接处理请求

 

PriorityBlockingQueue 优先级阻塞队列,此队列中的元素必须实现Comparable接口)

需要注意的是,容器中的存储是无需的,只有调用take方法时才进行排序,目的是避免每放一个元素就要对容器中所有元素重排序。

DelayQueue

        带有延迟时间的Queue,其中的元素只有当其指定的延迟时间到了,才能够从队列中获取该元素。DelayQueue中的元素必须实现Delayed接口,DelayQueue是一个没有大小限制的队列,应用场景很多,比如对缓存超时的数据进行移除、任务超时处理、空闲连接的关闭等等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值