Object 內建對象

對象Condition

條件變數對象

條件變數是利用纖程間共享的全域變數來進行同步的一種機制,主要包括兩個動作: 1)一個執行緒等待某個條件成立,而將自己掛起; 2)另一個執行緒使條件成立,並通知等待的纖程向下執行。

為了防止競爭,每個條件變數都需要一個Lock的配合(Lock可自行明確建立並傳遞進來,也可交由fibjs為您創建)

透過使用條件變量,可以利用一個條件變數控制一批纖程的開關;

以下是兩個纖程調度的實例:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
var coroutine = require("coroutine"); var cond = new coroutine.Condition(); var ready = false; var state = "ready"; function funcwait() { cond.acquire(); while (!ready) cond.wait(); state = "go" cond.release(); } coroutine.start(funcwait); cond.acquire(); console.log(state) ready = true; cond.notify(); coroutine.sleep(); console.log(state);

will output:

1 2
ready go

繼承關係

建構函數

Condition

條件變數建構子(條件變數所需的鎖由fibjs內部建構)

1
new Condition();

條件變數建構函數

1
new Condition(Lock lock);

呼叫參數:

  • lock:Lock, 使用自行建造的鎖

成員函數

wait

等待一個條件變數

1
Boolean Condition.wait(Integer timeout = -1);

呼叫參數:

  • timeout: Integer, 指定超時時間,單位毫秒,預設為-1,表示永不逾時。

回傳結果:

  • Boolean, 取得成功則回傳true,超時回傳false

notify

通知一個被阻塞的纖程(最後加入纖程池的)向下繼續執行

1
Condition.notify();

notifyAll

通知所有被阻塞的纖程向下繼續執行

1
Condition.notifyAll();

acquire

取得鎖的擁有權

1
Boolean Condition.acquire(Boolean blocking = true);

呼叫參數:

  • blocking: Boolean, 指定是否等待,為true 時等待,預設為真

回傳結果:

  • Boolean, 回傳是否成功取得鎖,為true 表示成功獲取

acquire 方法用於取得鎖的所有權,當鎖處於可取得狀態時,此方法立即傳回true。

當鎖不可獲取,且blocking 為true,則目前纖程進入休眠,當其他纖程釋放鎖後,此方法傳回true。

當鎖不可取得,且blocking 為false,則方法傳回false。


release

釋放鎖的擁有權

1
Condition.release();

此方法將釋放對鎖的擁有權,如果目前纖程未擁有鎖,此方法將拋出錯誤。


count

查詢目前等待任務數

1
Integer Condition.count();

回傳結果:

  • Integer, 返回任務數

toString

傳回物件的字串表示,一般回傳"[Native Object]",物件可以根據自己的特性重新實現

1
String Condition.toString();

回傳結果:

  • String, 傳回物件的字串表示

toJSON

傳回物件的JSON 格式表示,一般傳回物件定義的可讀屬性集合

1
Value Condition.toJSON(String key = "");

呼叫參數:

  • key: String, 未使用

回傳結果:

  • Value, 傳回包含可JSON 序列化的值