Package java.util.concurrent
java.util.concurrent.locks
和java.util.concurrent.atomic
包。
执行人
接口。Executor
是一个简单的标准化接口,用于定义自定义线程类子系统,包括线程池,异步I / O和轻量级任务框架。
根据正在使用的具体Executor类,任务可以在新创建的线程,现有任务执行线程或调用execute
的线程中执行,并且可以顺序执行或同时执行。
ExecutorService
提供了更完整的异步任务执行框架。
ExecutorService管理任务的排队和调度,并允许受控关闭。
ScheduledExecutorService
子接口和相关接口增加了对延迟和定期任务执行的支持。
ExecutorServices提供了安排异步执行任何函数的方法,表达为Callable
,结果模拟Runnable
。
Future
返回函数的结果,允许确定执行是否已完成,并提供取消执行的方法。
RunnableFuture
是Future
,拥有run
方法,在执行时设置其结果。
实现。 类ThreadPoolExecutor
和ScheduledThreadPoolExecutor
提供可调节的灵活线程池。 Executors
类为Executors的最常见种类和配置提供工厂方法,以及一些使用它们的实用方法。 基于Executors
其他实用程序包括提供Futures的公共可扩展实现的具体类FutureTask
和ExecutorCompletionService
,其有助于协调异步任务组的处理。
类ForkJoinPool
提供了一个Executor,主要用于处理ForkJoinTask
及其子类的实例。 这些类采用工作窃取调度程序,可以获得符合计算密集型并行处理中常常存在的限制的任务的高吞吐量。
队列
ConcurrentLinkedQueue
类提供高效的可扩展线程安全非阻塞FIFO队列。
ConcurrentLinkedDeque
类类似,但另外支持Deque
接口。
五个实现都java.util.concurrent
支持扩展BlockingQueue
接口中,定义阻塞put和take的版本: LinkedBlockingQueue
, ArrayBlockingQueue
, SynchronousQueue
, PriorityBlockingQueue
和DelayQueue
。 不同的类涵盖了生产者 - 消费者,消息传递,并行任务和相关并发设计的最常见使用上下文。
扩展接口TransferQueue
和实现LinkedTransferQueue
引入了同步transfer
方法(以及相关特征),其中生产者可以可选地阻止等待其消费者。
BlockingDeque
接口扩展BlockingQueue
以支持FIFO和LIFO(基于堆栈)操作。 LinkedBlockingDeque
类提供了一种实现方式。
定时
TimeUnit
类提供多个粒度(包括纳秒),用于指定和控制基于超时的操作。
除了无限期等待之外,程序包中的大多数类都包含基于超时的操作。
在使用超时的所有情况下,超时指定方法在指示超时之前应等待的最短时间。
实施工作尽最大努力在发生超时后尽快检测到超时。
然而,在检测到超时和在超时之后再次实际执行的线程之间可能经过不确定的时间量。
接受超时参数的所有方法都会将值小于或等于零,以表示根本不等待。
要等待“永远”,您可以使用值Long.MAX_VALUE
。
同步器
五个类有助于共同的专用同步习语。-
Semaphore
是一个经典的并发工具。 -
CountDownLatch
是一个非常简单但非常常见的实用程序,用于阻塞直到给定数量的信号,事件或条件成立。 -
CyclicBarrier
是一个可复位的多路同步点,在某些并行编程风格中很有用。 -
Phaser
提供了更灵活的屏障形式,可用于控制多个线程之间的分阶段计算。 -
Exchanger
允许两个线程在集合点交换对象,并且在多个管道设计中很有用。
并发集合
除了队列,这个包提供的集合实现在多线程环境中设计用于:ConcurrentHashMap
, ConcurrentSkipListMap
, ConcurrentSkipListSet
, CopyOnWriteArrayList
和CopyOnWriteArraySet
。
当预期许多线程访问给定集合时, ConcurrentHashMap
通常优于同步HashMap
,而ConcurrentSkipListMap
通常优于同步TreeMap
。
甲CopyOnWriteArrayList
优选同步ArrayList
时的预期数量的读取和遍历的数量大大超过更新的数量的列表。
与此包中的某些类一起使用的“Concurrent”前缀是一个简写,表示与类似“synchronized”类的几个不同之处。 例如, java.util.Hashtable
和Collections.synchronizedMap(new HashMap())
是同步的。 但ConcurrentHashMap
是“并发”。 并发集合是线程安全的,但不受单个排除锁的控制。 在ConcurrentHashMap的特定情况下,它可以安全地允许任意数量的并发读取以及大量并发写入。 当您需要通过单个锁来阻止对集合的所有访问时,“同步”类可能很有用,但代价是可扩展性较差。 在期望多个线程访问公共集合的其他情况下,通常优选“并发”版本。 当任何集合未被共享时,或者只有在持有其他锁时才可访问非同步集合。
大多数并发Collection实现(包括大多数队列)也与通常的java.util
约定不同,因为它们的Iterators和Spliterators提供弱一致而不是快速失败的遍历:
- 它们可以与其他操作同时进行
- 他们永远不会扔
ConcurrentModificationException
- 它们可以保证在构造时只存在一次元素,并且可以(但不保证)反映构造后的任何修改。
内存一致性属性
Chapter 17 of The Java™ Language Specification定义了内存操作的发生前关系,例如共享变量的读写。 只有在读取操作之前发生写入操作时 ,一个线程的写入结果才能保证对另一个线程的读取可见。synchronized
和volatile
构造以及Thread.start()
和Thread.join()
方法可以形成先发生过的关系。
特别是:
- 线程中的每个动作都发生在该线程中的每个动作之前 ,该动作在程序的顺序中稍后出现。
- 监视器的解锁(
synchronized
块或方法出口) 发生在同一监视器的每个后续锁定(synchronized
块或方法入口)之前。 并且因为发生在之前的关系是可传递的,所以在解锁之前线程的所有动作都发生在任何线程锁定该监视器之后的所有动作之前 。 - 写入
volatile
字段发生在每次后续读取同一字段之前。 写入和读取的volatile
领域也有类似的内存一致性效果进入和退出显示器,但不意味着互斥锁。 - 在线程上调用
start
发生在启动线程中的任何操作之前 。 - 线程中的所有操作都发生在任何其他线程从该线程上的
join
成功返回之前 。
java.util.concurrent
及其子包中的所有类的方法将这些保证扩展到更高级别的同步。
特别是:
- 在将对象放入任何并发集合之前的线程中的操作发生在从另一个线程中的集合访问或移除该元素之后的操作之前 。
- 在提交之前,操作在一个线程
Runnable
至Executor
发生-before其执行开始。 同样为Callables
提交了ExecutorService
。 - 由
Future
表示的异步计算所采取的操作发生在通过另一个线程中的Future.get()
检索结果之后的操作之前 。 - 操作之前为“释放”同步器的方法,例如
Lock.unlock
,Semaphore.release
,和CountDownLatch.countDown
一个成功的“获取”方法随后发生-之前的动作,例如Lock.lock
,Semaphore.acquire
,Condition.await
,和CountDownLatch.await
在另一个线程相同的同步对象。 - 对于每对经由成功交换对象的线程的
Exchanger
,现有的行动exchange()
在每个线程中发生,这些前向对应的后续exchange()
在另一个线程。 - 调用
CyclicBarrier.await
和Phaser.awaitAdvance
(及其变体) 之前的操作发生在屏障操作执行的操作之前 ,屏障操作执行的操作发生在从其他线程中的相应await
成功返回之后的操作之前发生 。
- 从以下版本开始:
- 1.5
-
枚举摘要 Enum 描述 TimeUnit TimeUnit
表示给定粒度单位的持续时间,并提供跨单元转换的实用方法,以及在这些单元中执行定时和延迟操作。 -
异常摘要 异常 描述 BrokenBarrierException 当线程尝试等待处于损坏状态的屏障或在线程等待时进入损坏状态时抛出异常。CancellationException 异常表示由于任务被取消而无法检索到产生值的任务(例如FutureTask
)的结果。CompletionException 在完成结果或任务的过程中遇到错误或其他异常时抛出异常。ExecutionException 尝试检索通过抛出异常而中止的任务的结果时抛出异常。RejectedExecutionException 当无法接受任务执行时,Executor
抛出异常。TimeoutException Exception thrown when a blocking operation times out.