Object 內建對象

對象Semaphore

纖程信號量對象

信號量物件管理一個內部計數器,此計數器呼叫acquire 或wait 後減一,呼叫release 或post 後加一。計數器不會減少到負數,因為acquire 和wait 在發現數值為0 的時候,會休眠目前纖程,直到其它纖程透過release 或post 增加計數器的值。

信號量常用的場合是限制資源同時使用,以及生產者/消費者模式的應用。

以資料庫請求為例,限制資源並發使用的情形:

1 2 3 4 5 6 7 8 9 10
var maxconnections = 5; var l = new coroutine.Semaphore(maxconnections); ...... l.acquire(); var conn = connectdb() ..... conn.close(); l.release();

生產者/消費者模式通常則將信號量與隊列配合使用。生產者在佇列中加入數據,並post 一個訊號,消費者則先wait 訊號,取得訊號後去隊查詢取數據。

繼承關係

建構函數

Semaphore

信號量構造函數

1
new Semaphore(Integer value = 1);

呼叫參數:

  • value: Integer, 計數器初始數值

成員函數

wait

等待一個信號量

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

呼叫參數:

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

回傳結果:

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

post

釋放一個信號量,等同於release()

1
Semaphore.post();

trywait

嘗試取得一個訊號,如不能獲取,則立即返回並傳回false,等同於acquire(false)

1
Boolean Semaphore.trywait();

回傳結果:

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

acquire

取得鎖的擁有權

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

呼叫參數:

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

回傳結果:

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

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

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

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


release

釋放鎖的擁有權

1
Semaphore.release();

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


count

查詢目前等待任務數

1
Integer Semaphore.count();

回傳結果:

  • Integer, 返回任務數

toString

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

1
String Semaphore.toString();

回傳結果:

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

toJSON

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

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

呼叫參數:

  • key: String, 未使用

回傳結果:

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