Queue队列的简单应用

本文介绍了JDK提供的两种并发队列实现:ConcurrentLinkedQueue和BlockingQueue。ConcurrentLinkedQueue适用于读写频繁且不易发生阻塞的场景;BlockingQueue包括ArrayBlockingQueue、LinkedBlockingQueue等,适用于需要阻塞等待的场景。文章还介绍了SynchronousQueue、PriorityBlockingQueue和DelayQueue等高级队列的使用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

ConcurrentLinkedQueue代表的高性能队列

ConcurrentLinkedQueue<String> q = new ConcurrentLinkedQueue<String>();
        q.offer("a");
        q.offer("b");
        q.offer("c");
        q.offer("d");
        q.add("e");

        System.out.println(q.poll());   //a 从头部取出元素,并从队列里删除
        System.out.println(q.size());   //4
        System.out.println(q.peek());   //b
        System.out.println(q.size());   //4

这里写图片描述

ArrayBlockingQueue

//ArrayBlockingQueue阻塞定长序列
ArrayBlockingQueue<String> array = new ArrayBlockingQueue<String>(5);//存放5个数据
        array.put("a");
        array.put("b");
        array.add("c");
        array.add("d");
        array.add("e");
        array.add("f");
        System.out.println(array.offer("a", 3, TimeUnit.SECONDS));//意思是3秒内 能放入返回true,放不进去返回false

结果如下
这里写图片描述

LinkedBlockingQueue

LinkedBlockingQueue阻塞队列(如果不给初始化限制就是无界限,一直放入元素)

//阻塞队列
        LinkedBlockingQueue<String> q = new LinkedBlockingQueue<String>();
        q.offer("a");
        q.offer("b");
        q.offer("c");
        q.offer("d");
        q.offer("e");
        q.add("f");
        System.out.println(q.size());

运用drainTo()方法 将容器中部分数据取出变为List也可以是其他容器

List<String> list = new ArrayList<String>();
        System.out.println(q.drainTo(list, 3));
        System.out.println(list.size());
        for (String string : list) {
            System.out.println(string);
        }

这里写图片描述

SynchronousQueue

final SynchronousQueue<String> q = new SynchronousQueue<String>();
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    System.out.println(q.take());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        t1.start();
        Thread t2 = new Thread(new Runnable() {

            @Override
            public void run() {
                q.add("asdasd");
            }
        });
        t2.start();     

技术选型

就好比一个城市,其中的公路就像是队列,车辆就是服务,
1.早晚高峰高峰时车辆非常的多,公路处理需要更快的处理信息,并且车辆却多,行驶的越慢,所以用ArrayBlockingQueue定长队列.
2.中午的时候车辆不是很多,公路也可以运行,那就选型LinkedBlockingQueue
3.如果是凌晨路上的只是几个,选中SynchronousQueue,模拟虚拟的队列,其实也用不上队列,用任务就执行就Ok了
这里写图片描述

PriorityBlockingQueue

这里写图片描述
Task.java

public class Task implements Comparable<Task>{

    private int id ;
    private String name;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    @Override
    public int compareTo(Task task) {
        return this.id > task.id ? 1 : (this.id < task.id ? -1 : 0);  
    }

    public String toString(){
        return this.id + "," + this.name;
    }

}

UsePriorityBlockingQueue.java

import java.util.concurrent.PriorityBlockingQueue;

public class UsePriorityBlockingQueue {


    public static void main(String[] args) throws Exception{


        PriorityBlockingQueue<Task> q = new PriorityBlockingQueue<Task>();

        Task t1 = new Task();
        t1.setId(3);
        t1.setName("id为3");
        Task t2 = new Task();
        t2.setId(4);
        t2.setName("id为4");
        Task t3 = new Task();
        t3.setId(1);
        t3.setName("id为1");

        //return this.id > task.id ? 1 : 0;
        q.add(t1);  //3
        q.add(t2);  //4
        q.add(t3);  //1

        // 1 3 4
        System.out.println("容器:" + q);
        System.out.println(q.take().getId());
        System.out.println("容器:" + q);
//      System.out.println(q.take().getId());
//      System.out.println(q.take().getId());



    }
}

DelayQueue

这里写图片描述
用小孩上网举例子到点了会被拿出来,takei方法是一直阻塞的状态
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值