Enum | 描述 |
---|---|
TimeUnit |
A
TimeUnit 表示给定的粒度单位的持续时间,并提供了跨单位转换的实用方法,并在这些单元中执行定时和延迟操作。
|
异常 | 描述 |
---|---|
BrokenBarrierException |
当线程尝试等待处于断开状态的屏障或线程等待时进入断开状态时抛出异常。
|
CancellationException |
异常表示由于任务被取消,无法检索值生成任务的结果,如 FutureTask 。
|
CompletionException |
在完成结果或任务的过程中遇到错误或其他异常时抛出异常。
|
ExecutionException |
尝试检索通过抛出异常中止的任务的结果时抛出的异常。
|
RejectedExecutionException |
异常通过抛出 Executor 当任务不能执行所接受。
|
TimeoutException |
阻塞操作超时时抛出异常。
|
java.util.concurrent.locks
和java.util.concurrent.atomic
软件包。
Executor
是一个简单的标准化接口,用于定义线程类自定义子系统,包括线程池,异步I / O和轻量级任务框架。
根据使用的具体的Executor类,任务可以在新创建的线程,现有任务执行线程或线程调用execute
中执行,并且可以顺序执行或同时执行。
ExecutorService
提供了一个更完整的异步任务执行框架。
ExecutorService管理任务的排队和调度,并允许受控关闭。
ScheduledExecutorService
子接口和关联接口增加了对延迟和周期性任务执行的支持。
ExecutorServices提供了排列异步执行方法的方法,表示为Callable
,结果轴承类型为Runnable
。
A Future
返回函数的结果,允许确定执行是否已完成,并提供取消执行的方法。
A RunnableFuture
是一个Future
,拥有一个run
方法,在执行时,设置其结果。
实施。 类别ThreadPoolExecutor
和ScheduledThreadPoolExecutor
提供可调谐,灵活的线程池。 Executors
类为执行程序的最常见种类和配置提供工厂方法,以及一些使用它们的实用方法。 基于Executors
其他实用Executors
包括具体的类别FutureTask
,提供了Futures的共同可扩展的实现,以及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
类提供了多个粒度(包括纳秒),用于指定和控制基于超时的操作。
软件包中的大多数类除了无限期的等待之外还包含基于超时的操作。
在所有使用超时的情况下,超时指定方法在指示超时之前应等待的最短时间。
实施做出“尽力而为”,在发现之后尽快检测超时。
然而,在超时检测到的时间和在该超时之后实际执行的线程之间可能经过不定期的时间。
接受超时参数的所有方法都将小于或等于0的值视为不等待。
要等待“永远”,可以使用Long.MAX_VALUE
的值。
Semaphore
是一个经典的并发工具。 CountDownLatch
是一个非常简单但非常通用的实用程序,直到给定数量的信号,事件或条件成立为止。 CyclicBarrier
是一种可复用的多路同步点,可用于某些类型的并行编程。 Phaser
提供了可以用于在多个线程之间控制相位计算的更灵活的障碍形式。 Exchanger
允许两个线程在会合点交换对象,并且在多个管道设计中是有用的。 ConcurrentHashMap
, ConcurrentSkipListMap
, ConcurrentSkipListSet
, CopyOnWriteArrayList
和CopyOnWriteArraySet
。
当预期许多线程访问给定的集合时, ConcurrentHashMap
通常优于同步的HashMap
,并且ConcurrentSkipListMap
通常优于同步的TreeMap
。
甲CopyOnWriteArrayList
优选同步ArrayList
时的预期数量的读取和遍历的数量大大超过更新的数量的列表。
与此包中某些类使用的“并发”前缀是一个简写,表示与类似“同步”类的几个差异。 例如java.util.Hashtable
和Collections.synchronizedMap(new HashMap())
被同步。 但ConcurrentHashMap
是“并发”。 并发集合是线程安全的,但不受单个排除锁的约束。 在ConcurrentHashMap的特定情况下,它可以安全地允许任意数量的并发读取以及可调整数量的并发写入。 当您需要通过单个锁来阻止对集合的所有访问时,“同步”类可能会有用,而不损害可扩展性。 在预期多个线程访问公共集合的其他情况下,“并发”版本通常是可取的。 并且当两个集合都是非共享的时候,不同步的集合是可取的,或者只有在持有其他锁时才可访问。
大多数并发收集实现(包括大多数队列)也与通常的java.util
约定不同,因为它们的Iterators和Spliterators提供弱一致而不是快速失败遍历:
ConcurrentModificationException
synchronized
和volatile
构造以及Thread.start()
和Thread.join()
方法可以形成发生之前的关系。
尤其是:
synchronized
块或方法条目) 之前,发生监视器的解锁( synchronized
块或方法退出)。 并且因为事件发生之前的关系是可传递的,所以在解锁之前的线程的所有动作都发生在所有线程锁定之后的所有动作之前 。 volatile
字段发生在该同一字段的每个后续读取之前 。 写入和读取volatile
字段具有与进入和退出显示器相似的内存一致性效果,但不要求互斥锁定。 start
发生在启动的线程中的任何动作之前 。 join
该线程。 java.util.concurrent
及其子包中的所有类的方法将这些保证扩展到更高级别的同步。
尤其是:
Runnable
到Executor
之前,线程中的Executor
发生在其执行开始之前 。 同样为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
成功返回之后的动作之前 。