Thinking in java -- 队列

运行下面代码

package containers;

//: containers/QueueBehavior.java
// Compares the behavior of some of the queues
import java.util.concurrent.*;
import java.util.*;
import net.mindview.util.*;

public class QueueBehavior {
    private static int count = 10;

    static <T> void test(Queue<T> queue, Generator<T> gen) {
        for (int i = 0; i < count; i++)
            queue.offer(gen.next());
        while (queue.peek() != null)
            System.out.print(queue.remove() + " ");
        System.out.println();
    }

    static class Gen implements Generator<String> {
        String[] s = ("one two three four five six seven " + "eight nine ten")
                .split(" ");
        int i;

        public String next() {
            return s[i++];
        }
    }

    public static void main(String[] args) {
        test(new LinkedList<String>(), new Gen());
        test(new PriorityQueue<String>(), new Gen());
        test(new ArrayBlockingQueue<String>(count), new Gen());
        test(new ConcurrentLinkedQueue<String>(), new Gen());
        test(new LinkedBlockingQueue<String>(), new Gen());
        test(new PriorityBlockingQueue<String>(), new Gen());
    }
} /*
     * Output: one two three four five six seven eight nine ten eight five four
     * nine one seven six ten three two one two three four five six seven eight
     * nine ten one two three four five six seven eight nine ten one two three
     * four five six seven eight nine ten eight five four nine one seven six ten
     * three two
     */// :~

程序test方法,通过queue.offer生成队列,并再通过queue.remove()异常并输出头元素。

输出结果,

one two three four five six seven eight nine ten

eight five four nine one seven six ten three two

one two three four five six seven eight nine ten

one two three four five six seven eight nine ten

one two three four five six seven eight nine ten

eight five four nine one seven six ten three two

LinkedList:

List 接口的链接列表实现。实现所有可选的列表操作,并且允许所有元素(包括 null)。除了实现 List 接口外,LinkedList 类还为在列表的开头及结尾 get、remove 和 insert 元素提供了统一的命名方法。这些操作允许将链接列表用作堆栈、队列或双端队列。

PriorityQueue:

一个基于优先级堆的无界优先级队列。优先级队列的元素按照其自然顺序进行排序,或者根据构造队列时提供的 Comparator 进行排序,具体取决于所使用的构造方法。优先级队列不允许使用 null 元素。依靠自然顺序的优先级队列还不允许插入不可比较的对象(这样做可能导致 ClassCastException)。

ArrayBlockingQueue

一个由数组支持的有界阻塞队列。此队列按 FIFO(先进先出)原则对元素进行排序。队列的头部 是在队列中存在时间最长的元素。队列的尾部 是在队列中存在时间最短的元素。新元素插入到队列的尾部,队列获取操作则是从队列头部开始获得元素。

ConcurrentLinkedQueue

一个基于链接节点的无界线程安全队列。此队列按照 FIFO(先进先出)原则对元素进行排序。队列的头部 是队列中时间最长的元素。队列的尾部 是队列中时间最短的元素。新的元素插入到队列的尾部,队列获取操作从队列头部获得元素。当多个线程共享访问一个公共 collection 时,ConcurrentLinkedQueue 是一个恰当的选择。此队列不允许使用 null 元素。

LinkedBlockingQueue

一个基于已链接节点的、范围任意的 blocking queue。此队列按 FIFO(先进先出)排序元素。队列的头部 是在队列中时间最长的元素。队列的尾部 是在队列中时间最短的元素。新元素插入到队列的尾部,并且队列获取操作会获得位于队列头部的元素。链接队列的吞吐量通常要高于基于数组的队列,但是在大多数并发应用程序中,其可预知的性能要低。

PriorityBlockingQueue

一个无界阻塞队列,它使用与类 PriorityQueue 相同的顺序规则,并且提供了阻塞获取操作。虽然此队列逻辑上是无界的,但是资源被耗尽时试图执行 add 操作也将失败(导致 OutOfMemoryError)。此类不允许使用 null 元素。依赖自然顺序的优先级队列也不允许插入不可比较的对象(这样做会导致抛出 ClassCastException)。

更多内容,详见JDK1.6中文版。http://tool.oschina.net/apidocs/apidoc?api=jdk-zh

时间: 2024-07-28 12:21:58

Thinking in java -- 队列的相关文章

java 队列、优先级队列、双向队列示例演示代码

package org.rui.collection2.queues; import java.util.LinkedList; import java.util.PriorityQueue; import java.util.Queue; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.Li

JAVA队列的使用

JAVA队列的使用 今天跟大家来看看如何在项目中使用队列.首先我们要知道使用队列的目的是什么?一般情况下,如果是一些及时消息的处理,并且处理时间很短的情况下是不需要使用队列的,直接阻塞式的方法调用就可以了.但是,如果在消息处理的时候特别费时间,这个时候如果有新的消息来了,就只能处于阻塞状态,造成用户等待.这个时候在项目中引入队列是十分有必要的.当我们接受到消息后,先把消息放到队列中,然后再用新的线程进行处理,这个时候就不会有消息的阻塞了.下面就跟大家介绍两种队列的使用,一种是基于内存的,一种是基

java队列Queue及阻塞队列

java队列 接口Queue类在java.util包,定义了以下6个方法 详细查看官方文档https://docs.oracle.com/javase/7/docs/api/java/util/Queue.html 什么是阻塞队列 BlockingQueue 队列是一种数据结构,它的特点是先进先出(First In First Out),它有两个基本操作:在队列尾部加入一个元素,从队列头部移除一个元素.队列在多线程应用中,常用于生产-消费场景. BlockingQueue 是 Java util

Redis之上的分布式Java队列

通过优锐课的java架构学习分享中,讨论了让我们使用Redisson Java框架讨论六种不同类型的基于Redis的分布式队列. 在Redis中使用队列 Redis是一个功能强大的工具,支持从字符串和列表到映射和流的许多不同类型的数据结构. 开发人员将Redis用于多种目的,包括用于数据库,缓存和消息代理. 像任何消息代理一样,Redis需要以正确的顺序发送消息. 可以根据消息的年龄或某些其他预定义的优先级等级发送消息. 为了存储这些未决消息,Redis开发人员需要队列数据结构. Redisso

进程间通信(java)--队列

前言: 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题.通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利.本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景. 认识BlockingQueue阻塞队列,顾名思义,首先它是一个队列,而一个队列在数据结构中所起的作用大致如下图所示:从上图我们可以很清楚看到,通过一个共享的队列,可以使得数据由队列的一端输入,从另外一

Java队列集合的性能测试

同时开10个线程存入和取出100万的数据,结论如下: DoubleBufferedQueue < ConcurrentLinkedQueue < ArrayBlockingQueue < LinkedBlockingQueue 执行结果如下: 100万 DoubleBufferedQueue入队时间:9510 出队时间:10771 100万 DoubleBufferedQueue入队时间:8169 出队时间:97891000万 DoubleBufferedQueue入队时间:98285

java - 队列

Queue接口与List.Set同一级别,都是继承了Collection接口.LinkedList实现了Queue接口.Queue接口窄化了对LinkedList的方法的访问权限(即在方法中的参数类型如果是Queue时,就完全只能访问Queue接口所定义的方法 了,而不能直接访问 LinkedList的非Queue的方法),以使得只有恰当的方法才可以使用.BlockingQueue 继承了Queue接口. 队列是一种数据结构.它有两个基本操作:在队列尾部加入一个元素,和从队列头部移除一个元素(注

叫号系统排队系统挂号系统实现(JAVA队列)

关于队列,使用的地方很的多. 现实中有许多的样例. 比方医院的挂号系统,银行里的叫号系统,食堂里的排队打饭等等.市场上又这种排队取号的设备.他们的功能基本例如以下: 1.系统可联网联机统一发号.2.系统可无线对接,也可有线连接:3.系统支持100种业务以上:4.系统支持多个等候区提示等候信息,各等候区语音及显示可独立.5.个性化语音可呼叫客户所办理的业务名称(医院版可呼叫病人姓名)等信息.6.号码可在不同服务类别的柜台窗体之间相互转移,顾客不必反复排队:7.具备登录操作功能和退出操作功能:工作開

java队列

转自:http://www.cnblogs.com/mercuryli/p/4636231.html 什么是Queue集合? 答:Queue用于模拟队列这种数据结构.队列通常是指“先进先出(FIFO)”的容器.队列的头部保存在队列中存放时间最长的元素,尾部保存存放时间最短的元素.新元素插入到队列的尾部,取出元素会返回队列头部的元素.通常,队列不允许随机访问队列中的元素. Queue接口中定义了如下的几个方法: void add(Object e): 将指定元素插入到队列的尾部. object e

Java队列存储结构及实现

一.队列(Queue) 队列是一种特殊的线性表,它只允许在表的前段(front)进行删除操作,只允许在表的后端(rear)进行插入操作.进行插入操作的端称为队尾,进行删除操作的端称为队头. 对于一个队列来说,每个元素总是从队列的rear端进入队列,然后等待该元素之前的所有元素出队之后,当前元素才能出对,遵循先进先出(FIFO)原则. 如果队列中不包含任何元素,该队列就被称为空队列. 二.顺序队列存储结构的实现 1 package com.ietree.basic.datastructure.qu