Java 8并发工具包简介
Java 8并发工具包由3个包组成,分别是java.util.concurrent、java.util.concurrent.atomic和java.util.concurrent.locks,提供了大量关于并发的接口、类、原子操作类、锁相关类。借助java.util.concurrent包,可以非常轻松地实现复杂的并发操作。java.util.concurrent包主要包含以下内容,后文将具体介绍:
阻塞队列:多种阻塞队列的实现,在队列为空或满时能够阻塞消费者或生产者相关线程。
并发容器:用于并发场景的容器类型,一般无需加锁。
线程池:创建单线程、固定大小或可缓存的线程池,支持周期性任务,也能够实现异步任务的返回。
锁:用于并发同步的锁;
原子类型:用于实现原子操作的数据类型,包括AtomicBoolean、AtomicInteger、AtomicLong、AtomicReference等
并发工具:用于并发场景的类,可以控制并发线程的同步、等待。
阻塞队列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。
本文来源:程序之心,转载请注明出处!
最新内容
© 2016 - 2024 chengxuzhixin.com All Rights Reserved.