對象Semaphore
纖程信號量對象
信號量物件管理一個內部計數器,此計數器呼叫acquire 或wait 後減一,呼叫release 或post 後加一。計數器不會減少到負數,因為acquire 和wait 在發現數值為0 的時候,會休眠目前纖程,直到其它纖程透過release 或post 增加計數器的值。
信號量常用的場合是限制資源同時使用,以及生產者/消費者模式的應用。
以資料庫請求為例,限制資源並發使用的情形:
1
2
3
4
5
6
7
8
9
10var maxconnections = 5;
var l = new coroutine.Semaphore(maxconnections);
......
l.acquire();
var conn = connectdb()
.....
conn.close();
l.release();
生產者/消費者模式通常則將信號量與隊列配合使用。生產者在佇列中加入數據,並post 一個訊號,消費者則先wait 訊號,取得訊號後去隊查詢取數據。
繼承關係
建構函數
Semaphore
信號量構造函數
1new Semaphore(Integer value = 1);
呼叫參數:
- value: Integer, 計數器初始數值
成員函數
wait
等待一個信號量
1Boolean Semaphore.wait(Integer timeout = -1);
呼叫參數:
- timeout: Integer, 指定超時時間,單位毫秒,預設為-1,表示永不逾時。
回傳結果:
- Boolean, 取得成功則回傳true,超時回傳false
post
釋放一個信號量,等同於release()
1Semaphore.post();
trywait
嘗試取得一個訊號,如不能獲取,則立即返回並傳回false,等同於acquire(false)
1Boolean Semaphore.trywait();
回傳結果:
- Boolean, 取得成功則回傳true,超時回傳false
acquire
取得鎖的擁有權
1Boolean Semaphore.acquire(Boolean blocking = true);
呼叫參數:
- blocking: Boolean, 指定是否等待,為true 時等待,預設為真
回傳結果:
- Boolean, 回傳是否成功取得鎖,為true 表示成功獲取
acquire 方法用於取得鎖的所有權,當鎖處於可取得狀態時,此方法立即傳回true。
當鎖不可獲取,且blocking 為true,則目前纖程進入休眠,當其他纖程釋放鎖後,此方法傳回true。
當鎖不可取得,且blocking 為false,則方法傳回false。
release
釋放鎖的擁有權
1Semaphore.release();
此方法將釋放對鎖的擁有權,如果目前纖程未擁有鎖,此方法將拋出錯誤。
count
查詢目前等待任務數
1Integer Semaphore.count();
回傳結果:
- Integer, 返回任務數
toString
傳回物件的字串表示,一般回傳"[Native Object]",物件可以根據自己的特性重新實現
1String Semaphore.toString();
回傳結果:
- String, 傳回物件的字串表示
toJSON
傳回物件的JSON 格式表示,一般傳回物件定義的可讀屬性集合
1Value Semaphore.toJSON(String key = "");
呼叫參數:
- key: String, 未使用
回傳結果:
- Value, 傳回包含可JSON 序列化的值