是一个带优先级的队列,而不是先进先出队列,该队列也没有上限,但是如果队列为空,那么取元素的操作take就会阻塞。
5、DelayQueue
是一个存放Delayed 元素的无界阻塞队列,只有在延迟期满时才能从中提取元素。
三、ArrayListBlockingQueue和LinkedBlockingQueue的区别?
1、队列中锁的实现不同
ArrayBlockingQueue生产者消费者使用同一个锁。
LinkedBlockingQueue生产用的是putLock,消费是takeLock。
2、在生产和消费时操作不同
ArrayBlockingQueue实现的队列中在生产和消费的时候,是直接将枚举对象插入或移除的;
LinkedBlockingQueue实现的队列中在生产和消费的时候,需要把枚举对象转换为节点进行插入或移除,会影响性能。
3、 队列大小初始化方式不同
ArrayBlockingQueue实现的队列必须指定大小
LinkedBlockingQueue可以不指定大小,默认是Integer.MAX_VALUE
ArrayBlockingQueue性能要比LinkedBlockingQueue性能要好,执行速度更快,ArrayBlockingQueue优先使用!
非阻塞队列
ConcurrentLinkedQueue是一个基于链接节点的无界线程安全队列,它采用先进先出的规则对节点进行排序,当我们添加一个元素的时候,它会添加到队列的尾部;当我们获取一个元素时,它会返回队列头部的元素。
入队和出队都采用CAS(compare and set)更新,这样允许多个线程并发执行,并且不会因为加锁而阻塞线程,使得并发性能更好。
注:CAS用于实现多线程同步的原子指令,它将内存位置的内容与给定值进行比较,只有在相同的情况下,将该内存位置的内容修改为新的给定值。
代码实例
package OSChina.Client;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class BlockingQueueTest {
static final SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
//定义装苹果的篮子
public static class Basket{
// 篮子,能够容纳3个苹果
static BlockingQueue<String> queue = new ArrayBlockingQueue<String>(3);
//生产苹果,放入篮子
public void produce() throws InterruptedException{
queue.put("An apple");
}
// 消费苹果,从篮子中取走
public String consume() throws InterruptedException{
String apple = queue.take();
return apple;
}
public static int getAppleNumber(){
return queue.size();
}
}
public static void testBasket(){
// 建立一个装苹果的篮子
final Basket basket = new Basket();
//定义苹果生产者
class Producer implements Runnable{
@Override
public void run() {
try {
while (true){
System.out.println("生产者准备生产苹果:"+sdf.format(new Date())+",篮子中苹果数量:"+Basket.getAppleNumber());
basket.produce();
System.out.println("生产者生产苹果完毕:" + sdf.format(new Date())+",篮子中苹果数量:"+Basket.getAppleNumber());
Thread.sleep(300);
}
}catch (InterruptedException ex){
}
}
}
//定义苹果消费者
class Consumer implements Runnable{
@Override
public void run() {
try {
while (true){
System.out.println("消费者准备消费苹果:" + sdf.format(new Date())+",篮子中苹果数量:"+Basket.getAppleNumber());
basket.consume();
System.out.println("消费完后有苹果:" + sdf.format(new Date())+",篮子中苹果数量:"+Basket.getAppleNumber());
Thread.sleep(1000);
}
}catch (InterruptedException ex){
}
}
}
### 最后如何让自己一步步成为技术专家
说句实话,如果一个打工人不想提升自己,那便没有工作的意义,毕竟大家也没有到养老的年龄。
当你的技术在一步步贴近阿里p7水平的时候,毫无疑问你的薪资肯定会涨,同时你能学到更多更深的技术,交结到更厉害的大牛。
**推荐一份Java架构之路必备的学习笔记,内容相当全面!!!**
![](https://img-blog.csdnimg.cn/img_convert/d9724345c46bfa0e329b18f2cd63e8fb.png)
成年人的世界没有容易二字,前段时间刷抖音看到一个程序员连着加班两星期到半夜2点的视频。在这个行业若想要拿高薪除了提高硬实力别无他法。
你知道吗?现在有的应届生实习薪资都已经赶超开发5年的程序员了,实习薪资26K,30K,你没有紧迫感吗?做了这么多年还不如一个应届生,真的非常尴尬!
进了这个行业就不要把没时间学习当借口,这个行业就是要不断学习,不然就只能被裁员。所以,抓紧时间投资自己,多学点技术,眼前困难,往后轻松!
要领取这些精心整理出来的资料的话,请记得
抖音看到一个程序员连着加班两星期到半夜2点的视频。在这个行业若想要拿高薪除了提高硬实力别无他法。
你知道吗?现在有的应届生实习薪资都已经赶超开发5年的程序员了,实习薪资26K,30K,你没有紧迫感吗?做了这么多年还不如一个应届生,真的非常尴尬!
进了这个行业就不要把没时间学习当借口,这个行业就是要不断学习,不然就只能被裁员。所以,抓紧时间投资自己,多学点技术,眼前困难,往后轻松!
要领取这些精心整理出来的资料的话,请记得
**————【关注】+【转发】+【点赞】支持我!创作不易![点击这里前往我的腾讯文档免费下载](https://gitee.com/vip204888/java-p7)**