套件 | 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 的所有權。 - 在某些條件變成 false 之前,Worker 的程式碼會在共用資源上運作,以防止 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 物件的 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 的所有權:呼叫 Mutex.unlock()
方法 (如果目前 Worker 未再次需要 mutex) 或呼叫 wait()
(如果 Worker 必須在其他 Worker 完成工作之後再次取得 mutex 的所有權)。
一旦釋放 mutex 的鎖定,在已呼叫 wait()
方法的 Worker 佇列中,下一個 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 的所有權:呼叫 Mutex.unlock()
方法 (如果目前 Worker 未再次需要 mutex) 或呼叫 wait()
(如果 Worker 必須在其他 Worker 完成工作之後再次取得 mutex 的所有權)。
一旦釋放 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 呼叫這個 Condition 物件的 notify()
或 notifyAll()
方法之前,Worker 會維持暫停狀態。
參數
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, 03:47 PM Z