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
提供了一个主要设计用于处理ForkJoinTask
及其子类实例的Executor。这些类采用工作窃取调度程序,可实现符合在计算密集型并行处理中经常存在的限制的高吞吐量。
队列
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”前缀是一种简写,表示与类似的“同步”类有几个不同之处。例如,java.util.Hashtable
和Collections.synchronizedMap(new HashMap())
是同步的。但是ConcurrentHashMap
是“并发的”。并发集合是线程安全的,但不受单个排除锁的控制。在ConcurrentHashMap的特定情况下,它安全地允许任意数量的并发读取以及大量并发写入。当需要通过单个锁阻止对集合的所有访问时,同步类可能很有用,但会牺牲可伸缩性。在其他情况下,其中多个线程预计将访问共同集合时,“并发”版本通常更可取。当集合未共享或仅在持有其他锁时可访问时,未同步的集合更可取。
大多数并发集合实现(包括大多数队列)还与通常的java.util
约定不同,因为它们的迭代器和分割器提供弱一致性而不是快速失败的遍历:
- 它们可以与其他操作同时进行
- 它们永远不会抛出
ConcurrentModificationException
- 它们保证遍历元素时,元素会按照构造时的状态遍历一次,可能(但不保证)反映构造后的任何修改。
内存一致性属性
《Java语言规范》第17章定义了对共享变量的读写等内存操作的happens-before关系。一个线程的写操作只有在写操作happens-before读操作时,另一个线程的读操作才能保证看到写操作的结果。synchronized
和volatile
构造,以及Thread.start()
和Thread.join()
方法可以形成 happens-before 关系。具体来说:
- 线程中的每个操作 happens-before 程序顺序中稍后出现的该线程中的每个操作。
- 监视器的解锁(
synchronized
块或方法退出) happens-before 同一监视器的每个后续锁定(synchronized
块或方法进入)。由于 happens-before 关系是传递的,解锁之前线程的所有操作 happen-before 所有后续锁定该监视器的线程的所有操作。 - 对
volatile
字段的写入 happens-before 该字段的每个后续读取。对volatile
字段的写入和读取具有类似于进入和退出监视器的内存一致性效果,但不涉及互斥锁定。 - 对线程调用
start
happens-before 启动线程中的任何操作。 - 线程中的所有操作 happen-before 任何其他线程成功从该线程的
join
中返回。
- 在将对象放入任何并发集合之前线程中的操作 happens-before 在另一个线程中访问或从集合中删除该元素的操作。
- 在将
Runnable
提交给Executor
之前线程中的操作 happens-before 其执行开始。对于提交给ExecutorService
的Callables
也是如此。 - 由
Future
表示的异步计算中的操作 happens-before 在另一个线程中通过Future.get()
检索结果的操作。 - 在“释放”同步器方法(如
Lock.unlock
、Semaphore.release
和CountDownLatch.countDown
)之前的操作 happens-before 在另一个线程中对同一同步器对象的成功“获取”方法(如Lock.lock
、Semaphore.acquire
、Condition.await
和CountDownLatch.await
)之后的操作。 - 对通过
Exchanger
成功交换对象的每对线程,每个线程中的exchange()
之前的操作 happens-before 另一个线程中相应exchange()
之后的操作。 - 在调用
CyclicBarrier.await
和Phaser.awaitAdvance
(以及其变体)之前的操作 happens-before 由屏障操作执行的操作,以及屏障操作执行的操作 happens-before 从其他线程的相应await
成功返回之后的操作。
- 查看 Java 语言规范:
-
17.4.5 Happens-before Order
- 自 JDK 版本:
- 1.5
-
ClassDescription提供了
ExecutorService
执行方法的默认实现。由数组支持的有界 阻塞队列。一个Deque
,还支持在检索元素时等待双端队列变为非空,并在存储元素时等待双端队列中有空间可用。一个Queue
,还支持在检索元素时等待队列变为非空,并在存储元素时等待队列中有空间可用。当线程尝试等待处于破损状态的屏障,或者在线程等待时屏障进入破损状态时抛出的异常。Callable<V>返回结果并可能抛出异常的任务。表示由于任务被取消而无法检索值生成任务(例如FutureTask
)的结果而抛出的异常。可以显式完成(设置其值和状态)的Future
,可以用作CompletionStage
,支持依赖函数和在其完成时触发的操作。通过async
方法生成的异步任务的标记接口。在完成结果或任务的过程中遇到错误或其他异常时抛出的异常。将新的异步任务的生成与已完成任务结果的消费分离的服务。可能是异步计算的阶段,在另一个 CompletionStage 完成时执行操作或计算值。ConcurrentHashMap<K,V> 支持检索的完全并发性和更新的高预期并发性的哈希表。将 ConcurrentHashMap 视为键的Set
,其中可以通过映射到公共值来选择性地启用添加。基于链接节点的无界并发 双端队列。基于链接节点的无界线程安全 队列。ConcurrentMap<K,V> 提供线程安全性和原子性保证的Map
。支持NavigableMap
操作的ConcurrentMap
,对其可导航子映射递归支持。可扩展的并发ConcurrentNavigableMap
实现。基于ConcurrentSkipListMap
的可扩展并发NavigableSet
实现。使用内部CopyOnWriteArrayList
执行所有操作的Set
。允许一个或多个线程等待,直到在其他线程中执行的一组操作完成的同步辅助。在触发并且没有剩余待处理操作时执行完成操作的ForkJoinTask
。允许一组线程等待彼此达到共同屏障点的同步辅助。用于标记应在给定延迟后执行操作的对象的混合样式接口。DelayQueue<E extends Delayed>Exchanger<V>线程可以在其中配对并交换元素的同步点。尝试检索由于任务抛出异常而中止的任务的结果时抛出的异常。执行提交的Runnable
任务的对象。使用提供的Executor
执行任务的CompletionService
。Flow.Processor<T,R> 充当订阅者和发布者的组件。生成由订阅者接收的项目(和相关的控制消息)的生产者。消息的接收者。将Flow.Publisher
和Flow.Subscriber
连接的消息控制。用于运行ForkJoinTask
的ExecutorService
。用于创建新的ForkJoinWorkerThread
的工厂。用于扩展在ForkJoinPool
中运行的任务的托管并行性的接口。ForkJoinTask<V>在ForkJoinPool
中运行的任务的抽象基类。由ForkJoinPool
管理的线程,执行ForkJoinTask
。Future<V>Future
代表异步计算的结果。表示计算状态。FutureTask<V>可取消的异步计算。基于链接节点的可选有界 阻塞双端队列。基于链接节点的可选有界 阻塞队列。基于链接节点的无界TransferQueue
。可重用的同步屏障,功能类似于CyclicBarrier
和CountDownLatch
,但支持更灵活的用法。使用与PriorityQueue
类相同的排序规则,并提供阻塞检索操作的无界 阻塞队列。递归无结果的ForkJoinTask
。递归有结果的ForkJoinTask
。当任务无法接受执行时由Executor
抛出的异常。无法由ThreadPoolExecutor
执行的任务的处理程序。一个ScheduledFuture
,它是一个Runnable
。一个ExecutorService
,可以安排在给定延迟后运行命令,或定期执行。可以取消的延迟产生结果的操作。一个ThreadPoolExecutor
,可以在给定延迟后额外安排命令运行,或定期执行。计数信号量。预览。结构化并发的基本API。预览。代表使用StructuredTaskScope.fork(Callable)
分叉的子任务预览。预览。代表子任务的状态。预览。检测到结构违规时抛出的异常。一个Flow.Publisher
,异步向当前订阅者发布提交的(非空)项目,直到关闭。一个阻塞队列,其中每个插入操作必须等待另一个线程的相应删除操作,反之亦然。根据需要在当前线程上创建新线程的对象。随机数生成器(周期为264),仅限于当前线程。一个ExecutorService
,使用可能有多个池化线程之一执行每个提交的任务,通常使用Executors
工厂方法进行配置。拒绝任务的处理程序,抛出一个RejectedExecutionException
。拒绝任务的处理程序,在execute
方法的调用线程中直接运行被拒绝的任务,除非执行程序已关闭,在这种情况下任务将被丢弃。拒绝任务的处理程序,丢弃最老的未处理请求,然后重试execute
,除非执行程序已关闭,在这种情况下任务将被丢弃。拒绝任务的处理程序,静默丢弃被拒绝的任务。当阻塞操作超时时抛出的异常。一个TimeUnit
表示给定粒度单位的时间持续时间,并提供跨单位进行转换的实用方法,并在这些单位中执行定时和延迟操作。一个BlockingQueue
,其中生产者可以等待消费者接收元素。