一心多用多執行緒 阻塞佇列(6) Semaphore

2021-07-24 08:52:24 字數 1638 閱讀 9623

六、有序的排隊進場-semaphore

在現實中我們會經常遇到排隊進場的一種情況,一家餐廳能容納的最多人數是固定的,假設是4人,那麼如果來了20個人的話最多也就進去四個人吃,乙個吃完了走另外乙個人進去。在多執行緒中也會遇到這種情況,對資源來說或許每次只能支援4個執行緒進行作業,那麼我們就需要用到semaphore(訊號量,該訊號量與計算機系統裡面的訊號量作用效果不同)來對這個排隊進場流程進行控制,在需要限制的執行緒中我們通過semaphore的acquire方法來獲取許可,然後決定能否執行,通過release方法對許可進行釋放,在初始化semaphore物件的時候我們需要給定乙個int引數表示當前支援的許可數,即上述現實例子的餐廳能容納的最多人數,然後把這個機制通過semaphore去幫我們處理,當然在semaphore中也有提供了相應的api讓我們知道當前等待的執行緒數,當前可獲取的許可數等,下面通過**來熟悉這個排隊進場的過程。

public

class semaphoretest catch (interruptedexception e1)

system.out.println("顧客進場");

system.out.println("顧客開始吃飯");

try catch (interruptedexception e)

valve.release();

}});

consumer.start();

}while(true) catch (interruptedexception e) }}

}

結果:

顧客進場

顧客開始吃飯

顧客進場

顧客開始吃飯

顧客進場

顧客進場

顧客開始吃飯

顧客開始吃飯

----------------------

當前還可通行數:0

當前作用佇列長度:6

當前是否有等待執行緒:true

----------------------

顧客進場

顧客開始吃飯

顧客進場

顧客開始吃飯

顧客進場

顧客開始吃飯

顧客進場

顧客開始吃飯

----------------------

當前還可通行數:0

當前作用佇列長度:2

當前是否有等待執行緒:true

----------------------

顧客進場

顧客開始吃飯

顧客進場

顧客開始吃飯

----------------------

當前還可通行數:2

當前作用佇列長度:0

當前是否有等待執行緒:false

----------------------

----------------------

當前還可通行數:4

當前作用佇列長度:0

當前是否有等待執行緒:false

----------------------

例子是一次性給出了十條執行緒,但是每次執行的執行緒只允許4條共同作業。通過上述**可以看出,如果使用訊號量對執行緒執行的**體進行控制的話,可以有效的決定當前最多的執行緒執行數,控制一定的併發量

一心賺錢的人,親子關係差

父母別光顧著賺錢。據英國 每日郵報 報道,加拿大英屬哥倫比亞大學心理學家最新研究顯示,那些沉迷於工作 財富和社會地位的父母,會因為被財富分心而忽視對孩子的教育。研究人員認為,金錢與育兒兩者之間存在衝突。研究者在乙個家庭日活動上對父母進行了心理問卷調查。他們讓一組父母閱讀了一篇關於該活動的經濟收益和成...

萬眾一心讚國足出局

北京時間11月17日晚,2006世界盃亞洲區預選賽d組中國隊與中國香港隊的比賽在廣州天河體育中心結束。最終中國隊7 0大勝香港,而科威特在主場6 1大勝馬來西亞。這樣中國隊與科威特在相同積分 相同淨勝球情況下,科威特憑藉進球數優勢壓倒中國隊晉級,中國隊屈居小組第二,無緣德國世界盃。儘管網上聲嘶力竭,...

三心二意沒結果,一心一意又如何

三心二意沒結果,一心一意又如何 的最高境界 我到底有沒有吃過東西?一稱體重,我就很不開心,我不開心的時候就想吃東西。中學時有賊心沒賊膽,大學時有賊膽沒賊心,現在賊心賊膽都有了,但賊沒有了。人生的悲哀就在於,當你想兩肋插刀的時候,卻只有一把刀。像你這種體格的男人聞這樣一朵嬌弱的花,看起來真讓人崩潰。人...