java队列之queue用法实例分析

Java队列之Queue用法实例分析

什么是队列?

队列是一种特殊的线性数据结构,按照先进先出(First In First Out,FIFO)的原则存储数据,在队列的一端添加数据,在另一端删除数据,有点像排队买东西,先来的先买,后来的后买。

在Java中,队列的实现方式是使用Queue接口,Queue是Java中表示队列的接口,它继承了Collection接口,并在这个基础上添加了一些额外方法。

Queue的特性

  1. 元素只能在队尾添加,只能在队首删除。
  2. Queue只允许youpeek操作(查询队头元素),而不允许遍历整个队列。
  3. 支持同步,可以作为多线程环境中的任务队列使用。

如何使用Queue?

  1. 创建一个Queue实例,可以使用Java中已经实现的类LinkedList作为队列。
Queue<String> queue=new LinkedList<>();
  1. 添加元素:
queue.offer("a");  // 添加元素a
queue.offer("b");  // 添加元素b
queue.offer("c");  // 添加元素c
  1. 删除元素:
queue.poll();  // 删除队头元素a
  1. 查询元素:
queue.peek();  // 查询队头元素,返回b

示例说明

示例1:使用Queue求解迷宫问题

队列可以很方便地求解迷宫问题。我们可以将每一个位置看作一个节点,将节点放入队列中,并进行遍历找出终点。

public static void bfs(int[][] maze, int startX, int startY, int endX, int endY) {
    Queue<Point> queue = new LinkedList<>();
    queue.offer(new Point(startX, startY, null));
    Set<Point> visited = new HashSet<>();
    while (!queue.isEmpty()) {
        Point point = queue.poll();
        if (point.x == endX && point.y == endY) {
            printPath(point);
            return;
        }
        visited.add(point);
        for (Point next : getNexts(maze, point)) {
            if (!visited.contains(next)) {
                queue.offer(next);
            }
        }
    }
}

示例2:使用Queue实现线程池

线程池可以通过阻塞队列实现。当线程池中所有线程都在执行任务时,新任务需要等待,此时新任务可以被添加到阻塞队列中,等待有空闲的线程执行。

public class ThreadPool {
    private int coreSize;
    private int maxSize;
    private BlockingQueue<Runnable> queue;

    public ThreadPool(int coreSize, int maxSize, int queueSize) {
        this.coreSize = coreSize;
        this.maxSize = maxSize;
        this.queue = new ArrayBlockingQueue<>(queueSize);
        init();
    }

    private void init() {
        for (int i = 0; i < coreSize; i++) {
            new Thread(() -> {
                while (true) {
                    try {
                        Runnable task = queue.take();
                        task.run();
                    } catch (InterruptedException e) {
                        break;
                    }
                }
            }).start();
        }
    }

    public void submit(Runnable task) throws InterruptedException {
        if (queue.size() == maxSize) {
            throw new RuntimeException("queue is full");
        }
        queue.put(task);
    }
}

以上示例仅为Queue使用的两个简单的例子,Queue在实际应用中有着更加广泛和深入的应用场景。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java队列之queue用法实例分析 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • Kotlin之在Gradle中无参(no-arg)编译器插件的使用详解

    下面我将详细讲解Kotlin在Gradle中无参(no-arg)编译器插件的使用,包含以下内容: 为什么需要无参编译器插件? 如何使用无参编译器插件? 示例说明。 为什么需要无参编译器插件? 在使用Kotlin编写Java框架时,我们经常需要生成一些无参构造函数,以便能够在框架中使用反射来创建对象。但是,由于Kotlin的默认构造函数参数是必须的,编译器不会…

    other 2023年6月26日
    00
  • 软件开发过程之需求分析步骤详解

    软件开发过程之需求分析步骤详解 1. 概述 需求分析是软件开发过程中的关键步骤,它是指对用户需求进行收集、概括和详细描述的过程。需求分析的目的是为了准确的理解用户的需求和目标,并最终制定出能够满足用户需求的软件方案。以下是需求分析的步骤详解。 2. 需求获取 需求获取是指收集用户需求的过程,主要通过以下几种方式: 2.1 用户访谈 通过直接与用户进行交流,收…

    other 2023年6月28日
    00
  • JAVA递归与非递归实现斐波那契数列

    本文将详细讲解“JAVA递归与非递归实现斐波那契数列”的完整攻略,包括什么是斐波那契数列,递归实现方式及非递归实现方式等内容。 什么是斐波那契数列 斐波那契数列是一个无限长的整数序列,其前两项为0和1,后续项均为前两项之和。其数列如下:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, … 递归实现方式 递归是一种…

    other 2023年6月27日
    00
  • pycharm软件代码配色和字体设置

    以下是“PyCharm软件代码配色和字体设置的完整攻略”的标准markdown格式文本,其中包含两个示例: PyCharm软件代码配色和字体设置的完整攻略 PyCharm是款流行的Python集成开发环境(IDE),提供了丰富的代码配色和字体设置选项,以满足不同用户的求。以下是PyCharm软件代码配色和字体设置的完整攻略。 1. 代码配色设置 PyChar…

    other 2023年5月10日
    00
  • intellitrace调试

    intellitrace调试 简介 Intellitrace是Visual Studio的一个调试工具,它提供了能够记录应用程序在运行时的状态变化的能力,可以捕获和保存以前运行过的调试会话信息,以便在后期调试时能够重现这些信息以精确地排查问题。Intellitrace调试可有效节省开发者调试成本和时间,特别适用于debug复杂逻辑的问题。 使用步骤 打开Vi…

    其他 2023年3月28日
    00
  • 下载神器网络蚂蚁Ant Download Manager Pro 安装步骤及授权激活详细图文教程

    下载神器网络蚂蚁Ant Download Manager Pro 安装步骤及授权激活详细图文教程 Ant Download Manager Pro 是一款功能强大的下载管理工具,下面是安装步骤及授权激活的详细攻略。 步骤一:下载 Ant Download Manager Pro 首先,你需要下载 Ant Download Manager Pro 的安装文件。…

    other 2023年8月3日
    00
  • linux centos 修改ip地址细节介绍

    Linux CentOS 修改IP地址攻略 在Linux CentOS系统中,修改IP地址可以通过编辑网络配置文件来实现。下面是详细的攻略步骤: 打开终端,以root用户身份登录。 进入网络配置文件目录,使用以下命令: cd /etc/sysconfig/network-scripts/ 查看当前网络配置文件,找到需要修改的网络接口文件,一般以ifcfg-开…

    other 2023年7月30日
    00
  • 【基础】css实现多重边框的5种方式

    【基础】CSS实现多重边框的5种方式 CSS是网页设计中必不可少的一部分,它可以用来实现各种炫酷的效果。本文将介绍CSS实现多重边框的5种方式,希望对你的网页设计有所帮助。 1. 使用box-shadow box-shadow属性是CSS3中新增的一个属性,可以用来在HTML元素周围创建一个阴影。我们可以设置多个 box-shadow 属性来实现多重边框。 …

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部