DelayQueue-我是/不是不完整的
在某些情况下,存放在Queue中的对象,在它们准备被取出之前,会需要被放在另一Queue中一段时间。这时你可使用java.util.concurrent.DelayQueue类,他实现类BlockingQueue接口。DelayQueue需要Queue对象被驻留在Queue上一段指定时间。
我想用来证实它的现实例子(这可能是你非常渴望的)是关于松饼(muffins)。噢,Muffin对象(象我们正在谈论的Java-没有coffee双关意图)。假定你有一个DelayQueue并在其中放了一些Muffin对象。Muffin对象(如下所示)必须实现java.util.concurrent.Delayed
接口,以便可被放在DelayQueue中。这个接口需要Muffin对象实现getDelay方法(如下所示)。getDelay方法,实际上声明给多
长时间让对象保存在DelayQueue中。当该方法返回的值变为0或小于0时,对象就准备完毕(或在本例子中,是烤制完毕)并允许被取出(见
Listing 3
)。
Muffin类也实现compareTo(java.util.concurrent.Delayed)方法。由于Delayed接口继承自
java.lang.Comparable
类,这通过约定限制你要实现Muffin对象的bakeCompletion时间。
由于你不是真想去吃没有完全烤熟的Muffin,因此,需要将Muffin放在DelayQueue中存放推荐的烤制时间。Listing 4
,取自DelayQueueUsageExample类,展示了从DelayQueue中enqueue和dequeue Muffin对象。
如你所见,对Muffin对象的烤制时间是使用它的构造器设置的(构造器期望烤制时间是以秒计)。
如
前所讲,Muffin对象放到DelayQueue中是不允许被取出的,直到他的延时时间(又叫烤制时间)超期。元素被从Queue中取出基于最早的延时
时间。在本例中,如果你有一些已经烤过的Muffin对象,他们将按他们已经等待多久而被取出(换句话说,最早被烤制的Muffin会在新烤制的
Muffin之前被取出)。
SynchronousQueue
在Java
1.5中,另外一种阻塞Queue实现是SynchronousQueue。相当有趣的是,该Queue没有内在容量。这是故意的,因为Queue意在用
于传递目的。这意味着,在一个同步Queue结构中,put请求必须等待来自另一线程的给SynchronousQueue的take请求。同时,一个
take请求必须等待一个来自另一线程的给SynchronousQueue的put请求。用程序来示例此概念,可参见示例代码。类似于前边的
LinkedBlockingQueue例子,它包含一个consumer(SynchConsumer),见Listing 5
。
Listing 5
中的代码使用SynchronousQueue类的
poll(long timeout,TimeUnit unit)方法。此方法允许poll过程在厌倦等待另一消费线程写SynchronousQueue之前等待一个指定时间(本例中是20秒)。
在Listing 6
中的producer(SynchProducer
)使用相似的offer(E
o,long timeout, TimeUnit
unit)方法去放置对象到SynchronousQueue中。使用此方法允许在
厌倦等待另一线程去读取SynchronousQueue之前等待一段时间(本例中为10秒)
。
TestSynchQueue
展示了producer和consumer的动作:
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.LinkedBlockingQueue;
public class TestSynchQueue
{
public static void main(String args[])
{
SynchronousQueue<String> synchQueue = new SynchronousQueue<String>();
SynchProducer producer = new SynchProducer("ProducerA",synchQueue, System.out);
SynchConsumer consumerA = new SynchConsumer("ConsumerA", synchQueue, System.out);
consumerA.start();
producer.start();
}
}
当试图明白隐藏在SynchronousQueue后面的概念时,要牢记这些Queue通常被使用在什么地方。JavaDoc中关于同步Queue指出:
"它们[同步Queue]是适合于传递设计,在那里运行在一个线程中的对象必须与运行在另外一个线程中的对象同步以便于交给它一些信息,时间或任务。"
作者简介:
Kulvir Singh Bhogal 是为IBM工作的顾问, 规划并实现在客户网站上的Java-centric解决方案.
|
相关推荐
Java 同步器 SynchronousQueue 详解及实例 Java 中的同步器 SynchronousQueue 是一种特殊的阻塞队列,它最多只能放一个元素,这个元素如果不在特定的时间消费掉就会被删除,队列的长度始终为 0。SynchronousQueue ...
在C++编程语言中,`Queue`是一种常用的数据结构,它遵循“先进先出”(First In First Out, FIFO)的原则。通常,C++标准库提供了`<queue>`头文件来实现基本的队列操作,但这个标准队列并没有设置上限。在某些特定...
- **队列**:先进先出(FIFO)的数据结构,C++的std::queue,Java的java.util.Queue提供实现。 - **树**:如二叉树、AVL树、红黑树等,C++和Java都有标准库支持,C则需要自定义实现。 - **哈希表**:C++的std::...
在Java编程语言中,数据结构是组织和管理数据的关键元素,它们提供了高效访问和操作数据的方式。本主题将深入探讨Java中的五种基础数据结构:链表、队列、栈、双端队列(deque)以及堆。我们将通过分析给定的源代码...
Java软件结构与数据结构源码是学习和理解Java编程中核心概念的重要资源。数据结构是计算机科学的基础,它涉及到如何组织和存储数据以便于高效地访问和修改。在Java中,掌握数据结构对于开发高性能、可扩展的软件至关...
Java的`java.util.Queue`接口提供了enqueue(通常为add方法)、dequeue(通常为remove或poll方法)等操作。 5. **堆**:堆是一种特殊的树形数据结构,满足堆属性:父节点的值总是大于或等于(最大堆)或小于或等于...
Java提供了`java.util.Queue`接口及其实现,如`LinkedList`可以作为队列使用。 5. **集合**:包括ArrayList、LinkedList、HashSet、HashMap等,是Java中常用的容器类。ArrayList基于动态数组,适合随机访问;...
在Java程序设计与数据结构的学习过程中,第九章通常会涵盖数据结构的重要概念和应用,包括数组、链表、栈、队列、树等基础数据结构,以及如何利用这些数据结构来解决问题。本资源提供了第九章的习题答案,旨在帮助...
4. **队列**:队列是一种先进先出(FIFO)的数据结构,Java中的Queue接口和LinkedList类可实现队列。队列常用于任务调度、缓冲区等。 5. **树**:树是一种非线性数据结构,包括二叉树、平衡树(如AVL树、红黑树)等...
在这个Java队列实现的数据结构作业练习中,我们将会探讨如何使用Java来创建一个简单的队列,并分析`Queue.java`和`Node.java`这两个文件可能包含的内容。 首先,`Queue.java`很可能是实现队列接口或类的文件。在...
- **数组(Array)**:Java中的数组是基本的数据结构,可以直接声明和使用。 - **链表(Linked List)**:`java.util.LinkedList`提供了链表的实现。 - **栈(Stack)**:`java.util.Stack`是一个继承自`Vector`的类,实现...
这个压缩包中的代码示例可能包含了这些数据结构的实现,例如,链表可能包含`Node`类和相关的操作方法,有序二叉树可能有`BinarySearchTree`类,队列则可能是对`Queue`接口的简单实现。通过学习和理解这些代码,...
Java中的`java.util.Queue`接口和其实现如`LinkedList`可实现队列操作。 5. 树:树是分层的数据结构,每个元素(节点)可能有零个或多个子节点。二叉树是最常见的树类型,包括二叉查找树(BST)、平衡二叉树(AVL、...
《Java软件结构域数据结构第四版》是一本深入探讨如何在Java编程环境中设计和使用数据结构的权威书籍。这本书的核心目标是帮助读者理解和掌握数据结构的基本概念,以及如何有效地利用这些概念来解决实际的编程问题。...
6. **集合框架**:Java集合框架是处理对象数组的工具,包括List、Set、Queue和Map等接口,以及ArrayList、LinkedList、HashSet、HashMap等实现类。掌握这些集合的使用能有效提高代码的效率和可维护性。 7. **数据...
队列是先进先出(FIFO)的数据结构,适用于任务调度、消息传递等,Java的Queue接口和LinkedList类可以用来实现队列。 4. **树**:树是一种非线性的数据结构,每个节点可能有零个或多个子节点。二叉树是树的一种特殊...
本篇文章将深入探讨Java中队列(Queue)数据结构的实现。 队列是一种线性数据结构,遵循“先进先出”(FIFO,First In First Out)的原则。它的一端称为前端(Front)或头,另一端称为后端(Rear)。新元素在后端...
JAVA版的《数据结构》则可能强调Java平台特有的数据结构实现,如集合框架(Collection Framework),其中包括接口(如List、Set和Queue)和实现(如ArrayList、LinkedList、HashSet、TreeSet等)。Java的这些数据...
Java的`java.util.Queue`接口及其实现类如`LinkedList`可以用来创建队列。 5. **哈希表**:哈希表(HashMap)通过哈希函数将键映射到值,提供了快速的插入、删除和查找操作。Java的`java.util.HashMap`类是实现哈希...
在Java等面向对象的语言中,数据结构通常通过类或接口来实现。本资源提供的是“数据结构常用接口”,这意味着它包含了对常见数据结构操作的规范定义,使得开发人员可以方便地按照这些接口去编写自己的数据结构实现,...