队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。 在队列这种数据结构中,最先插入的元素将是最先被删除的元素;反之最后插入的元素将是最后被删除的元素,因此队列又称为“先进先出”(FIFO—first in first out)的线性表。 抛出异常 返回特殊值 插入 add(e) offer(e) 移除 remove() poll() 检查 element() peek() Queue使用时要尽量避免Collection的add()和remove()方法,而是要使用offer()来加入元素,使用poll()来获取并移出元素。它们的优点是通过返回值可以判断成功与否, add()和remove()方法在失败的时候会抛出异常。 如果要使用前端而不移出该元素,使用element()或者peek()方法。 element方法是在队列为空的时候抛异常,而peek则是返回null。 LinkedList类实现了Queue接口 public class QueueTest { public static void main(String[] args) { // add()和remove()方法在失败的时候会抛出异常(不推荐) Queue<String> queue = new LinkedList<String>(); // 添加元素 queue.offer("a"); queue.offer("b"); queue.offer("c"); queue.offer("d"); queue.offer("e"); for (String q : queue) { System.out.println(q); } System.out.println("==="); System.out.println("poll=" + queue.poll()); // 返回第一个元素,并在队列中删除 for (String q : queue) { System.out.println(q); } System.out.println("==="); System.out.println("element=" + queue.element()); // 返回第一个元素 for (String q : queue) { System.out.println(q); } System.out.println("==="); System.out.println("peek=" + queue.peek()); // 返回第一个元素 for (String q : queue) { System.out.println(q); } } } BlockingQueue即阻塞队列,从阻塞这个词可以看出,在某些情况下对阻塞队列的访问可能会造成阻塞。被阻塞的情况主要有如下两种: 1. 当队列满了的时候进行入队列操作 2. 当队列空了的时候进行出队列操作 BlockingQueue四个接口,接口定义的方法如下: Throws Exception Special Value Blocks Times Out 插入 add(o) offer(o) put(o) offer(o, timeout, timeunit) 移除 remove(o) poll() take() poll(timeout, timeunit) 检查 element() peek() 这四套方法对应的特点分别是: BlockingQueue 方法以四种形式出现, 对于不能立即满足但可能在将来某一时刻可以满足的操作, 这四种形式的处理方式不同:第一种是抛出一个异常, 第二种是返回一个特殊值(null 或 false,具体取决于操作), 第三种是在操作可以成功前,无限期地阻塞当前线程, 第四种是在放弃前只在给定的最大时间限制内阻塞 BlockingQueue的实现类 1. ArrayBlockingQueue 2. DelayQueue 3. LinkedBlockingQueue 4. PriorityBlockingQueue 5. SynchronousQueue ArrayBlockingQueue是一个有边界的阻塞队列,它的内部实现是一个数组。有边界的意思是它的容量是有限的,我们必须在其初始化的时候指定它的容量大小,容量大小一旦指定就不可改变。 LinkedBlockingQueue阻塞队列大小的配置是可选的,如果我们初始化时指定一个大小,它就是有边界的,如果不指定,它就是无边界的。说是无边界,其实是采用了默认大小为Integer.MAX_VALUE的容量 它的内部实现是一个链表。 PriorityBlockingQueue是一个没有边界的队列,它的排序规则和 java.util.PriorityQueue一样。需要注意,PriorityBlockingQueue中允许插入null对象。 所有插入PriorityBlockingQueue的对象必须实现 java.lang.Comparable接口,队列优先级的排序规则就是按照我们对这个接口的实现来定义的。 SynchronousQueue队列内部仅允许容纳一个元素。当一个线程插入一个元素后会被阻塞,除非这个元素被另一个线程消费。 DelayQueue 是一个无界的BlockingQueue,用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走。这种队列是有序的, 即队头对象的延迟到期的时间最长。如果没有任何延迟到期,那么就不会有任何头元素,并且poll将返回null(正因为这样,不能将 null放置到这种队列中). DelayQueue阻塞的是其内部元素,DelayQueue中的元素必须实现 java.util.concurrent.Delayed接口,这个接口的定义非常简单: public interface Delayed extends Comparable<Delayed> { long getDelay(TimeUnit unit); } getDelay()方法的返回值就是队列元素被释放前的保持时间,如果返回0或者一个负值,就意味着该元素已经到期需要被释放,此时DelayedQueue会通过其take()方法释放此对象。 从上面Delayed 接口定义可以看到,它还继承了Comparable接口,这是因为DelayedQueue中的元素需要进行排序,一般情况,我们都是按元素过期时间的优先级进行排序。 PriorityBlockingQueue示例: public class PriorityElement implements Comparable<PriorityElement> { private int priority;// 定义优先级 PriorityElement(int priority) { // 初始化优先级 this.priority = priority; } @Override public int compareTo(PriorityElement o) { // 按照优先级大小进行排序 return priority >= o.getPriority() ? 1 : -1; } public int getPriority() { return priority; } public void setPriority(int priority) { this.priority = priority; } @Override public String toString() { return "PriorityElement [priority=" + priority + "]"; } } public class PriorityBlockingQueueExample { public static void main(String[] args) throws InterruptedException { PriorityBlockingQueue<PriorityElement> queue = new PriorityBlockingQueue<PriorityElement>(); for (int i = 0; i < 5; i++) { Random random=new Random(); PriorityElement ele = new PriorityElement(random.nextInt(10)); queue.put(ele); } while(!queue.isEmpty()){ System.out.println(queue.take()); } } } 参考文章:http://blog.csdn.net/suifeng3051/article/details/48807423 管道流(pipeStream)是种特殊的流,用于在不同线程间传送数据,一个线程一端发送数据到管道,另外一个线程从输入管道读取 管道流有两种: 字符流:PipedReader、PipedWriter 字节流:PipedInputStrean、PipedOutputStram import java.io.IOException; import java.io.PipedReader; import java.io.PipedWriter; public class PipedWriteTest { public static class ThradPipedReaderA extends Thread { PipedReader pipedReader; public ThradPipedReaderA(PipedReader pipedReader) { this.pipedReader = pipedReader; } @Override public void run() { try { char[] chararray = new char[20]; int readLenth = pipedReader.read(chararray); while (readLenth != -1) { String str = new String(chararray, 0, readLenth); System.out.println("读到的数据为:" + str); readLenth = pipedReader.read(chararray); } pipedReader.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public static class ThradPipedWriteB extends Thread { PipedWriter pipedWriter; public ThradPipedWriteB(PipedWriter pipedWriter) { this.pipedWriter = pipedWriter; } @Override public void run() { try { for (int i = 0; i <= 10; i++) { pipedWriter.write("发送数据" + i); } pipedWriter.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public static void main(String[] args) throws IOException { PipedReader pipedReader = new PipedReader(); PipedWriter pipedWriter = new PipedWriter(); pipedReader.connect(pipedWriter);// 做个链接才能通讯 ThradPipedReaderA a = new ThradPipedReaderA(pipedReader); ThradPipedWriteB b = new ThradPipedWriteB(pipedWriter); a.start(); b.start(); } }
相关推荐
在Java编程语言中,`Queue`接口是集合框架的一部分,它代表了先进先出(FIFO)的数据结构,也就是我们通常所说的队列。队列是一种非常基础且实用的数据结构,广泛应用于多线程同步、任务调度、缓存管理等多个场景。...
Java中的队列(Queue)是线程安全的数据结构,它遵循先进先出(FIFO,First In First Out)原则,即最先...希望本文的实例解析对您在理解和应用Java队列时有所帮助,也鼓励您根据实际需求选择和定制适合的队列实现。
### 消息队列Queue与Topic的区别 #### 一、概念概述 消息队列(Message Queue)是一种应用程序间通信机制,允许程序之间通过发送和接收消息进行通信,而不必直接建立连接。它提供了异步处理机制,使得消息的发送者...
Java队列是Java集合框架中的一个关键组成部分,主要用于在多个线程之间同步数据传输或实现异步处理。队列遵循先进先出(FIFO)的原则,即最早添加到队列中的元素将首先被处理。本教程将深入探讨如何在Java中使用队列...
设一循环队列Queue,只有头指针front,不设尾指针,另设一个内含元素个数的计数器,试写出相应的进队、出队算法。
1. **`BlockingQueue`接口**:这是Java并发编程中的核心接口,它继承自`Queue`接口,增加了阻塞操作的put()和take()方法。当队列满时,put()会阻塞生产者线程;当队列空时,take()会阻塞消费者线程,直到有元素可用...
在Java中,`java.util.Queue`接口提供了队列的基本操作,如添加元素(enqueue)、移除元素(dequeue)以及检查队首元素等。Queue接口定义了许多方法,如`add()`、`offer()`、`remove()`、`poll()`、`peek()`等,用于...
Java队列模拟实现是一个典型的计算机科学中的数据结构应用,它主要涉及了Java编程语言和队列数据结构。在这个工程中,开发者已经创建了一个基于图形用户界面(GUI)的应用程序,用于演示和操作队列的各种功能。以下...
在实际应用中,Java提供了一些内置的队列接口和类,如Queue、Deque、ArrayDeque等,它们提供了上述操作的实现。开发者可以根据具体需求选择合适的数据结构和实现方式。例如,如果需要高效访问元素,可以选择...
java队列之queue用法实例分析主要介绍了java队列之queue用法实例分析,Queue 队列就是一个先入先出(FIFO)的数据结构,Queue接口继承Collection接口。Queue接口与List、Set同一级别,都是继承了Collection接口。 ...
在《Java队列》这篇博文中,可能详细探讨了以下知识点: 1. **Queue接口**:介绍`Queue`接口的基本方法,如`enqueue()`(通常通过`add()`或`offer()`实现)和`dequeue()`(通常通过`remove()`或`poll()`实现)。还...
在IT领域,尤其是在Java编程中,队列是一种基础且重要的数据结构。队列遵循“先进先出”(First In First Out, FIFO)原则,它的主要功能是存储和管理元素序列,使得新添加的元素(入队)总是在序列末尾,而移除元素...
在这个Java队列实现的数据结构作业练习中,我们将会探讨如何使用Java来创建一个简单的队列,并分析`Queue.java`和`Node.java`这两个文件可能包含的内容。 首先,`Queue.java`很可能是实现队列接口或类的文件。在...
Java队列(java.util.Queue) 队列是一种先进先出(FIFO)的数据结构,常用于线程间的通信。`java.util.Queue` 提供了多种队列实现,如 `ArrayBlockingQueue`, `LinkedBlockingQueue` 和 `PriorityQueue`。队列...
### 使用Vector类(继承)实现先进先出队列类Queue的Java实现 #### 概述 本篇文章将详细介绍如何利用Java中的`Vector`类来实现一个具有先进先出特性的队列类`Queue`。队列是一种特殊的线性表,只允许在一端进行插入...
### 线程安全队列Queue #### 一、背景介绍 在开发多线程应用时,线程安全成为至关重要的考量因素之一。特别是在需要处理并发任务时,如何确保线程之间的安全通信变得尤为重要。本篇文章将围绕一个具体的场景——...
3. **Java队列(Queue)**:队列是一种先进先出(FIFO)的数据结构,常用于在多线程环境中传递数据。Java中的`java.util.Queue`接口提供了多种队列实现,如`ArrayDeque`、`LinkedList`和`PriorityQueue`。队列可以...
`Queue.java`可能是接口或者抽象类,定义了队列的基本操作,如`offer()`, `peek()`, `poll()`等,`ArrayQueue`和`Vector`可能是实现了这个接口的具体类。 总结来说,这两个实现都展示了如何在Java中构建队列数据...
Java MSMQ(Message Queuing)是Java编程中用于实现异步通信的一种技术,它基于微软的MSMQ(Microsoft Message Queue)服务。在分布式系统中,消息队列扮演着至关重要的角色,因为它允许不同组件之间解耦,使得系统...
在Java中,我们可以使用`java.util.Queue`接口及其实现类,如`LinkedList`或`ArrayDeque`来创建队列。 接下来,我们需要创建两个线程类:一个是`CustomerThread`,代表等待叫号的客户,另一个是`ServiceThread`,...