`

Java 队列Queue

 
阅读更多
队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
在队列这种数据结构中,最先插入的元素将是最先被删除的元素;反之最后插入的元素将是最后被删除的元素,因此队列又称为“先进先出”(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队列

    在Java编程语言中,`Queue`接口是集合框架的一部分,它代表了先进先出(FIFO)的数据结构,也就是我们通常所说的队列。队列是一种非常基础且实用的数据结构,广泛应用于多线程同步、任务调度、缓存管理等多个场景。...

    Java 队列 Queue 用法实例详解

    Java中的队列(Queue)是线程安全的数据结构,它遵循先进先出(FIFO,First In First Out)原则,即最先...希望本文的实例解析对您在理解和应用Java队列时有所帮助,也鼓励您根据实际需求选择和定制适合的队列实现。

    消息队列 Queue与Topic区别.docx

    ### 消息队列Queue与Topic的区别 #### 一、概念概述 消息队列(Message Queue)是一种应用程序间通信机制,允许程序之间通过发送和接收消息进行通信,而不必直接建立连接。它提供了异步处理机制,使得消息的发送者...

    Using_Java_Queue.zip_java队列

    Java队列是Java集合框架中的一个关键组成部分,主要用于在多个线程之间同步数据传输或实现异步处理。队列遵循先进先出(FIFO)的原则,即最早添加到队列中的元素将首先被处理。本教程将深入探讨如何在Java中使用队列...

    设一循环队列Queue,只有头指针front,不设尾指针,另设一个内含元素个数的计数器,试写出相应的进队、出队算法。

    设一循环队列Queue,只有头指针front,不设尾指针,另设一个内含元素个数的计数器,试写出相应的进队、出队算法。

    QueueMonitor:使用 Java 的队列监视器

    1. **`BlockingQueue`接口**:这是Java并发编程中的核心接口,它继承自`Queue`接口,增加了阻塞操作的put()和take()方法。当队列满时,put()会阻塞生产者线程;当队列空时,take()会阻塞消费者线程,直到有元素可用...

    JAVA 数据结构之Queue处理实例代码

    在Java中,`java.util.Queue`接口提供了队列的基本操作,如添加元素(enqueue)、移除元素(dequeue)以及检查队首元素等。Queue接口定义了许多方法,如`add()`、`offer()`、`remove()`、`poll()`、`peek()`等,用于...

    java队列模拟实现

    Java队列模拟实现是一个典型的计算机科学中的数据结构应用,它主要涉及了Java编程语言和队列数据结构。在这个工程中,开发者已经创建了一个基于图形用户界面(GUI)的应用程序,用于演示和操作队列的各种功能。以下...

    java队列实现(顺序队列、链式队列、循环队列)

    在实际应用中,Java提供了一些内置的队列接口和类,如Queue、Deque、ArrayDeque等,它们提供了上述操作的实现。开发者可以根据具体需求选择合适的数据结构和实现方式。例如,如果需要高效访问元素,可以选择...

    java队列之queue用法实例分析

    java队列之queue用法实例分析主要介绍了java队列之queue用法实例分析,Queue 队列就是一个先入先出(FIFO)的数据结构,Queue接口继承Collection接口。Queue接口与List、Set同一级别,都是继承了Collection接口。 ...

    java队列

    在《Java队列》这篇博文中,可能详细探讨了以下知识点: 1. **Queue接口**:介绍`Queue`接口的基本方法,如`enqueue()`(通常通过`add()`或`offer()`实现)和`dequeue()`(通常通过`remove()`或`poll()`实现)。还...

    Java Design Demo -简单的队列

    在IT领域,尤其是在Java编程中,队列是一种基础且重要的数据结构。队列遵循“先进先出”(First In First Out, FIFO)原则,它的主要功能是存储和管理元素序列,使得新添加的元素(入队)总是在序列末尾,而移除元素...

    Java队列实现,数据结构

    在这个Java队列实现的数据结构作业练习中,我们将会探讨如何使用Java来创建一个简单的队列,并分析`Queue.java`和`Node.java`这两个文件可能包含的内容。 首先,`Queue.java`很可能是实现队列接口或类的文件。在...

    java定时器\多线程(池)\java队列Demo

    Java队列(java.util.Queue) 队列是一种先进先出(FIFO)的数据结构,常用于线程间的通信。`java.util.Queue` 提供了多种队列实现,如 `ArrayBlockingQueue`, `LinkedBlockingQueue` 和 `PriorityQueue`。队列...

    利用Vector类(继承)编写一个先进先出的队列类Queue java实现

    ### 使用Vector类(继承)实现先进先出队列类Queue的Java实现 #### 概述 本篇文章将详细介绍如何利用Java中的`Vector`类来实现一个具有先进先出特性的队列类`Queue`。队列是一种特殊的线性表,只允许在一端进行插入...

    线程安全队列Queue

    ### 线程安全队列Queue #### 一、背景介绍 在开发多线程应用时,线程安全成为至关重要的考量因素之一。特别是在需要处理并发任务时,如何确保线程之间的安全通信变得尤为重要。本篇文章将围绕一个具体的场景——...

    java定时器+多线程(池)+java队列Demo

    3. **Java队列(Queue)**:队列是一种先进先出(FIFO)的数据结构,常用于在多线程环境中传递数据。Java中的`java.util.Queue`接口提供了多种队列实现,如`ArrayDeque`、`LinkedList`和`PriorityQueue`。队列可以...

    java-Using-Array-for-Queue.zip_java队列实现

    `Queue.java`可能是接口或者抽象类,定义了队列的基本操作,如`offer()`, `peek()`, `poll()`等,`ArrayQueue`和`Vector`可能是实现了这个接口的具体类。 总结来说,这两个实现都展示了如何在Java中构建队列数据...

    msmq.rar_java msmq_java 消息队列_java消息队列_msmq_消息队列

    Java MSMQ(Message Queuing)是Java编程中用于实现异步通信的一种技术,它基于微软的MSMQ(Microsoft Message Queue)服务。在分布式系统中,消息队列扮演着至关重要的角色,因为它允许不同组件之间解耦,使得系统...

    java多线程模拟队列实现排队叫号

    在Java中,我们可以使用`java.util.Queue`接口及其实现类,如`LinkedList`或`ArrayDeque`来创建队列。 接下来,我们需要创建两个线程类:一个是`CustomerThread`,代表等待叫号的客户,另一个是`ServiceThread`,...

Global site tag (gtag.js) - Google Analytics