對象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
21var 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
2ready
go
繼承關係
建構函數
Condition
條件變數建構子(條件變數所需的鎖由fibjs內部建構)
1new Condition();
條件變數建構函數
1new Condition(Lock lock);
呼叫參數:
- lock:Lock, 使用自行建造的鎖
成員函數
wait
等待一個條件變數
1Boolean Condition.wait(Integer timeout = -1);
呼叫參數:
- timeout: Integer, 指定超時時間,單位毫秒,預設為-1,表示永不逾時。
回傳結果:
- Boolean, 取得成功則回傳true,超時回傳false
notify
通知一個被阻塞的纖程(最後加入纖程池的)向下繼續執行
1Condition.notify();
notifyAll
通知所有被阻塞的纖程向下繼續執行
1Condition.notifyAll();
acquire
取得鎖的擁有權
1Boolean Condition.acquire(Boolean blocking = true);
呼叫參數:
- blocking: Boolean, 指定是否等待,為true 時等待,預設為真
回傳結果:
- Boolean, 回傳是否成功取得鎖,為true 表示成功獲取
acquire 方法用於取得鎖的所有權,當鎖處於可取得狀態時,此方法立即傳回true。
當鎖不可獲取,且blocking 為true,則目前纖程進入休眠,當其他纖程釋放鎖後,此方法傳回true。
當鎖不可取得,且blocking 為false,則方法傳回false。
release
釋放鎖的擁有權
1Condition.release();
此方法將釋放對鎖的擁有權,如果目前纖程未擁有鎖,此方法將拋出錯誤。
count
查詢目前等待任務數
1Integer Condition.count();
回傳結果:
- Integer, 返回任務數
toString
傳回物件的字串表示,一般回傳"[Native Object]",物件可以根據自己的特性重新實現
1String Condition.toString();
回傳結果:
- String, 傳回物件的字串表示
toJSON
傳回物件的JSON 格式表示,一般傳回物件定義的可讀屬性集合
1Value Condition.toJSON(String key = "");
呼叫參數:
- key: String, 未使用
回傳結果:
- Value, 傳回包含可JSON 序列化的值