Java 8并发工具包漫游指南(上)

2017-03-19 From 程序之心 By 丁仪

Java 8并发工具包简介

Java 8并发工具包由3个包组成,分别是java.util.concurrent、java.util.concurrent.atomic和java.util.concurrent.locks,提供了大量关于并发的接口、类、原子操作类、锁相关类。借助java.util.concurrent包,可以非常轻松地实现复杂的并发操作。java.util.concurrent包主要包含以下内容,后文将具体介绍:

  1. 阻塞队列:多种阻塞队列的实现,在队列为空或满时能够阻塞消费者或生产者相关线程。

  2. 并发容器:用于并发场景的容器类型,一般无需加锁。

  3. 线程池:创建单线程、固定大小或可缓存的线程池,支持周期性任务,也能够实现异步任务的返回。

  4. 锁:用于并发同步的锁;

  5. 原子类型:用于实现原子操作的数据类型,包括AtomicBoolean、AtomicInteger、AtomicLong、AtomicReference等

  6. 并发工具:用于并发场景的类,可以控制并发线程的同步、等待。


阻塞队列BlockingQueue

在BlockingQueue中,生产者可以持续向队列插入新的元素,直到队列满为止,队列满后生产者线程被阻塞;消费者可以持续从队列取出元素,直到队列空为止,队列空后消费者线程被阻塞。

BlockingQueue提供了四种类型的操作方法,在操作不能立即执行的情况下有不同的表现。


抛出异常

返回特殊值

阻塞

超时返回

插入

add(o)

offer(o)

put(o)

offer(o, timeout, timeunit)

删除

remove(o)

poll()

take()

poll(timeout, timeunit)

检查

element()

peek()




Java 8提供了多种类型的BlockingQueue实现类,

ArrayBlockingQueue:基于数组实现的有界阻塞队列,创建后不能修改队列的大小;

LinkedBlockingQueue:基于链表实现的有界阻塞队列,默认大小为Integer.MAX_VALUE,有较好的吞吐量,但可预测性差。

PriorityBlockingQueue:具有优先级的无界阻塞队列,不允许插入null,所有元素都必须可比较(即实现Comparable接口)。

SynchronousQueue:只有一个元素的同步队列。若队列中有元素插入操作将被阻塞,直到队列中的元素被其他线程取走。

DelayQueue:无界阻塞队列,每个元素都有一个延迟时间,在延迟时间之后才释放元素。


阻塞双端队列BlockingDueue

Dueue是“Double Ended Queue”的缩写。生产者和消费者可以在队列的两端进行插入和删除操作。

在头部提供了四种类型的操作方法,在操作不能立即执行的情况下有不同的表现。



抛出异常

返回特殊值

阻塞

超时返回

插入

addFirst(o)

offerFirst(o)

putFirst(o)

offerFirst(o, timeout, timeunit)

删除

removeFirst(o)

pollFirst(o)

takeFirst(o)

pollFirst(timeout, timeunit)

检查

getFirst(o)

peekFirst(o)




在尾部提供了四种类型的操作方法,在操作不能立即执行的情况下有不同的表现。



抛出异常

返回特殊值

阻塞

超时返回

插入

addLast(o)

offerLast(o)

putLast(o)

offerLast(o, timeout, timeunit)

删除

removeLast(o)

pollLast(o)

takeLast(o)

pollLast(timeout, timeunit)

检查

getLast(o)

peekLast(o)



Java 8只提供了一种类型的BlockingDueue实现类,

LinkedBlockingDeque:基于双向链表实现的有界阻塞队列,默认大小为Integer.MAX_VALUE,有较好的吞吐量,但可预测性差。


阻塞转移队列TransferQueue

TransferQueue接口继承了BlockingQueue接口,因此具有BlockingQueue接口的所有方法,并增加了一些方法。方法及作用如下:


tryTransfer(E e):若当前存在一个正在等待获取的消费者线程,则该方法会即刻转移e,并返回true;若不存在则返回false,但是并不会将e插入到队列中。这个方法不会阻塞当前线程,要么快速返回true,要么快速返回false。

transfer(E e):若当前存在一个正在等待获取的消费者线程,即立刻将e移交之;否则将元素e插入到队列尾部,并且当前线程进入阻塞状态,直到有消费者线程取走该元素。

tryTransfer(E e, long timeout, TimeUnit unit):若当前存在一个正在等待获取的消费者线程,会立即传输给它; 否则将元素e插入到队列尾部,并且等待被消费者线程获取消费掉。若在指定的时间内元素e无法被消费者线程获取,则返回false,同时该元素从队列中移除。


Java 8 提供了一个基于链表的实现类LinkedTransferQueue。

本文来源:程序之心,转载请注明出处!

君子曰:学不可以已。
《算法导论(原书第3版)》
本书是操作系统领域的经典教材,主要内容包括进程与线程、内存管理、文件系统、输入/输出、死锁、虚拟化和云、多处理机系统、安全,以及关于UNIX、Linux、Android和Windows的实例研究等。第4版对知识点进行了全面更新,反映了当代操作系统的发展与动向。本书适合作为高等院校计算机专业的操作系统课程教材,也适合相关技术人员参考。
发表感想

© 2016 - 2024 chengxuzhixin.com All Rights Reserved.

浙ICP备2021034854号-1    浙公网安备 33011002016107号