Java 并发核心编程(三)

 

4.3Queues

Queues类似于沟通“生产者”和“消费者”的管道。组件从管道的一端放入,然后从另一端取出:“先进先出”(FIFO)的顺序。Queue接口在JavaSE5新添加到java.util中的,能够被用于单线程访问的场景中,主要适用于多个生产者、一个或多个消费者的情景,所有的读写操作都是基于同一个队列。

java.util.concurrent包中的BlockingQueue接口是Queue的子接口,而且还添加了新的特性处理如下场景:队列满(此时刚好有一个生产者要加入一个新的组件)、队列空(此时刚好有一个消费者读取或者删除一个组件)。BlockingQueue提供如下方案解决这些情况:一直阻塞等待直到其他线程修改队列的数据状态;阻塞一段时间之后返回,如果在这段时间内有其他线程修改队列数据,那么也会返回。

5QueueBlockingQueue的方法:

方法

策略

插入

移除

核查

Queue

抛出异常

add

remove

element

返回特定的值

offer

poll

peek

Blocking Queue

一直阻塞

put

take

n/a

超时阻塞

offer

poll

n/a

JDK中提供了一些Queue的实现,在表6中是这些实现类的关系列表。

方法

描述

PriorityQueue

PriorityQueue是唯一一个非线程安全的队列实现类,用于单线程存放数据并且将数据排序。

CurrentLinkedQueue

一个无界的、基于链接列表的、唯一一个线程安全的队列实现类,不支持BlockingQueue

ArrayBlockingQueue

一个有界的、基于数组的阻塞队列。

LinkedBlockingQueue

一个有界的、基于链接列表的阻塞队列。有可能是最常用的队列实现。

PriorityBlockingQueue

一个无界的、基于堆的阻塞队列。队列根据设置的Comparator(比较器)来确定组件读取、移除的顺序(不是队列默认的FIFO顺序)

DelayQueue

一个无界的、延迟元素(每个延迟元素都会有相应的延迟时间值)的阻塞队列实现。只有在延时期过了之后,元素才能被移除,而且最先被移除的是延时最先到期的元素。

SynchronousQueue

一种0容量的队列实现,生产者添加元素之后必须等待消费者移除后才可以返回,反之依然。如果生产者和消费者2个线程同时访问,那么参数直接从生产者传递到消费者。经常用于线程之间的数据传输。

 

4.4Deque

JavaSE6中新增加了两端都可以添加和删除的队列-Deque (发音"deck",not "dick"). Deques不仅可以从一端添加元素,从另一端移除,而且两端都可以添加和删除元素。如同BlockingQueueBlockingDeque接口也为阻塞等待和超时等待的特殊情况提供了解决方法。因为Deque继承QueueBlockingDeque继承BlockingQueue,下表中的方法都是可以使用的:

接口

头或尾

策略

插入

移除

核查

Queue

Head

抛出异常

addFirst

removeFirst

getFirst

返回特定的值

offerFirst

pollFirst

peekFirst

Tail

抛出异常

addLast

removeLast

getLast

返回特定的值

offerLast

pollLast

peekLast

BlockingQueue

Head

一直阻塞

putFirst

takeFirst

n/a

超时阻塞

offerFirst

pollFirst

n/a

Tail

一直阻塞

putLast

takeLast

n/a

超时阻塞

offerLast

pollLast

n/a

 

Deque的一个特殊应用场景是只在一个端口进行添加、删除、检查操作--堆栈(first-in-last-out顺序)Deque接口提供了stack相同的方法:push(), pop()peek(),这方法和addFirst(), removeFirst(), peekFirst()一一对应,可以把Deque的任何一个实现类当做堆栈使用。表6中是JDKDequeBlockingDeque的实现。注意Deque继承QueueBlockingDeque继承自BlockingQueue

8Deques

你可能感兴趣的:(java,jdk,编程)