中高级工程师Java开发!Java队列Queue

是一个带优先级的队列,而不是先进先出队列,该队列也没有上限,但是如果队列为空,那么取元素的操作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)**
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值