包 | flash.concurrent |
类 | public final class Condition |
继承 | Condition Object |
语言版本: | ActionScript 3.0 |
运行时版本: | Flash Player 11.5, AIR 3.5 |
以下是使用 Condition 对象的一种可能的工作流程:
- 使用 Condition 对象之前,第一个 worker 必须通过调用 Mutex 对象的
lock()
或tryLock()
方法,来接管该条件关联的 mutex 的所有权。 - worker 的代码对共享资源进行操作,直到某些条件变为 false,从而防止 worker 对共享资源执行过多的操作。例如,如果共享资源是一组要处理的数据,则当没有要继续处理的数据时,worker 便不再执行操作。
- 此时,调用 Condition 对象的
wait()
方法暂停 worker 的执行,释放 mutex 的所有权。 - 有时,第二个 worker 会接管 mutex 的所有权。由于 mutex 可用,因此第二个 worker 的代码对共享资源的操作是安全的。第二个 worker 会执行满足条件所需的任何操作,以便第一个 worker 可以再次执行自己的操作。例如,如果第一个 worker 没有要处理的数据,则第二个 worker 会将更多要处理的数据传递给共享资源。
- 此时,与第一个 worker 的工作有关的条件为 true,因此需要通知第一个 worker,告知其条件已满足。要通知第一个 worker,第二个 worker 的代码会调用 Condition 对象的
notify()
方法或其notifyAll()
方法。 - 除调用
notify()
之外,第二个 worker 还需要释放 mutex 的所有权。实现方法是调用 Mutex 对象的unlock()
方法或 Condition 对象的wait()
方法。既然第一个 worker 调用了wait()
方法,则 mutex 的所有权将返回给第一个 worker。然后第一个 worker 将继续执行跟在wait()
调用后的下一行代码。
Condition 类是一种特殊的对象类型,它是在 worker 之间共享的,而不是在 worker 之间复制的。当您通过调用 Worker 对象的 setSharedProperty()
方法或通过使用 MessageChannel 对象而将条件从一个 worker 传递给另一个 worker 时,这两个 worker 引用的是运行时内存中的同一个 Condition 对象。
相关 API 元素
属性 | 由以下参数定义 | ||
---|---|---|---|
constructor : Object
对类对象或给定对象实例的构造函数的引用。 | Object | ||
isSupported : Boolean [静态] [只读]
指示当前平台是否支持 Condition 类。 | Condition | ||
mutex : Mutex [只读]
与此条件关联的 mutex。 | Condition |
方法 | 由以下参数定义 | ||
---|---|---|---|
创建一个新的 Condition 实例。 | Condition | ||
表示对象是否已经定义了指定的属性。 | Object | ||
表示 Object 类的实例是否在指定为参数的对象的原型链中。 | Object | ||
指定此 Condition 对象表示的条件已经满足,mutex 的所有权将被返回给正等待此条件的下一个 worker(如果有)。 | Condition | ||
指定此 Condition 对象表示的条件已经满足,mutex 的所有权将被返回给正等待此条件的所有 worker。 | Condition | ||
表示指定的属性是否存在、是否可枚举。 | Object | ||
设置循环操作动态属性的可用性。 | Object | ||
返回此对象的字符串表示形式,其格式设置遵守区域设置特定的约定。 | Object | ||
返回指定对象的字符串表示形式。 | Object | ||
返回指定对象的原始值。 | Object | ||
指定此 Condition 对象表示的条件未满足,当前 worker 需要等待,直到条件满足后,再执行更多的代码。 | Condition |
isSupported | 属性 |
mutex | 属性 |
Condition | () | 构造函数 |
notify | () | 方法 |
public function notify():void
语言版本: | ActionScript 3.0 |
运行时版本: | Flash Player 11.5, AIR 3.5 |
指定此 Condition 对象表示的条件已经满足,mutex 的所有权将被返回给正等待此条件的下一个 worker(如果有)。
调用此方法不会自动释放 mutex 的所有权。调用 notify()
之后,您应明确释放 mutex 的所有权,有两种方法:如果当前 worker 不再需要 mutex,则调用 Mutex.unlock()
方法;如果该 worker 应当在其他 worker 已经完成其工作后再次获取 mutex 的所有权,则调用 wait()
方法。
一旦 mutex 的锁定释放,worker 队列中已经调用了 wait()
方法的下一个 worker 将获取 mutex,恢复代码执行。
引发
IllegalOperationError — 如果当前 worker 未拥有此条件的 mutex
|
notifyAll | () | 方法 |
public function notifyAll():void
语言版本: | ActionScript 3.0 |
运行时版本: | Flash Player 11.5, AIR 3.5 |
指定此 Condition 对象表示的条件已经满足,mutex 的所有权将被返回给正等待此条件的所有 worker。
调用此方法不会自动释放 mutex 的所有权。调用 notify()
之后,您应明确释放 mutex 的所有权,有两种方法:如果当前 worker 不再需要 mutex,则调用 Mutex.unlock()
方法;如果该 worker 应当在其他 worker 已经完成其工作后再次获取 mutex 的所有权,则调用 wait()
方法。
一旦 mutex 的锁定释放,各个等待 worker 将按照其调用 wait()
方法的顺序逐个接收所有权。已经调用了 wait()
方法的各个 worker 将轮流获取 mutex,恢复代码执行。当该 worker 调用 Mutex.unlock()
方法或 wait()
方法时,mutex 所有权会切换到下一个等待中的 worker。 mutex 所有权每次在 worker 之间切换时,这种转换将作为一个单一的原子操作来执行。
引发
IllegalOperationError — 如果当前 worker 未拥有此条件的 mutex
|
wait | () | 方法 |
public function wait(timeout:Number = -1):Boolean
语言版本: | ActionScript 3.0 |
运行时版本: | Flash Player 11.5, AIR 3.5 |
指定此 Condition 对象表示的条件未满足,当前 worker 需要等待,直到条件满足后,再执行更多的代码。调用此方法将暂停当前 worker 的执行线程,并释放条件的 mutex 的所有权。这些步骤将作为单一的原子操作来执行。worker 保持暂停,直到另一个 worker 调用此 Condition 对象的 notify()
或 notifyAll()
方法。
参数
timeout:Number (default = -1 ) — worker 继续工作前应暂停执行的最长时间(以毫秒计)。如果此值为 -1(默认),则表示没有超时时间,执行将无限期暂停。
|
Boolean — 如果该方法由于经过了超时时间而返回,则返回 true 。否则该方法返回 false 。
|
引发
IllegalOperationError — 如果当前 worker 未拥有此条件的 mutex
| |
ArgumentError — 如果 timeout 参数小于 0 且不等于 -1
| |
ScriptTimeoutError — 如果该方法是从 Flash Player 中的原始 worker 中的代码调用的,且 worker 暂停的时间超过了脚本超时限制(默认值为 15 秒)
| |
Error — 如果调用了该方法,且当调用方 worker 的执行暂停时,等待 worker 即终止。
|
Tue Jun 12 2018, 11:04 AM Z