多線(xiàn)程之信號(hào)量

  1. 簡(jiǎn)單的Semaphore實(shí)現(xiàn)
public class Semaphore {
    private boolean signal = false;
    public synchronized void take() {
      this.signal = true;
      this.notify();
     }
public synchronized void release() throws InterruptedException{
    while(!this.signal) wait();
      this.signal = false;
    }
}
  1. 使用Semaphore來(lái)發(fā)出信號(hào)
Semaphore semaphore = new Semaphore();
SendingThread sender = new SendingThread(semaphore)怎棱;
ReceivingThread receiver = new ReceivingThread(semaphore);
receiver.start();
sender.start();

public class SendingThread {
  Semaphore semaphore = null;
  public SendingThread(Semaphore semaphore){
    this.semaphore = semaphore;
  }
  public void run(){
    while(true){
    //do something, then signal
    this.semaphore.take();
    }
  }
}
public class RecevingThread {
  Semaphore semaphore = null;
   public ReceivingThread(Semaphore semaphore){
    this.semaphore = semaphore;
  }
  public void run(){
    while(true){
      this.semaphore.release();
      //receive signal, then do something...
    }
  }
}
  1. 可計(jì)數(shù)的Semaphore
public class CountingSemaphore {
  private int signals = 0;
  public synchronized void take() {
    this.signals++;
    this.notify();
  }
  public synchronized void release() throws InterruptedException{
    while(this.signals == 0) wait();
    this.signals--;
  }
}
  1. 有上限的Semaphore
public class BoundedSemaphore {
  private int signals = 0;
  private int bound   = 0;
  public BoundedSemaphore(int upperBound){
    this.bound = upperBound;
  }
   public synchronized void take() throws InterruptedException{
    while(this.signals == bound) wait();
    this.signals++;
    this.notify();
}
   public synchronized void release() throws InterruptedException{
    while(this.signals == 0) wait();
    this.signals--;
    this.notify();
  }
}
  1. 把Semaphore當(dāng)鎖來(lái)使用
BoundedSemaphore semaphore = new BoundedSemaphore(1);
...
semaphore.take();
  try{
  //critical section
  } finally {
  semaphore.release();
  }

例子:

public class SemaphoreTest {
    public static void main(String[] args) {
        ExecutorService service= Executors.newCachedThreadPool();
        final Semaphore sp=new Semaphore(3);
        for (int i=0;i<10;i++){
            Runnable runnable=new Runnable() {
                @Override
                public void run() {
                    try {
                        sp.acquire();
                    }catch (Exception e){
                        e.printStackTrace();
                    }
                    System.out.println("線(xiàn)程"+Thread.currentThread().getName()+"進(jìn)入,當(dāng)前已有"+(3-sp.availablePermits()));
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    //System.out.println("線(xiàn)程"+Thread.currentThread().getName()+"離開(kāi)墩新,當(dāng)前已有"+(3-sp.availablePermits()));
                    sp.release();
                    System.out.println("線(xiàn)程"+Thread.currentThread().getName()+"離開(kāi),當(dāng)前已有"+(3-sp.availablePermits()));

                }
            };
            service.execute(runnable);
        }
    }
}

輸出結(jié)果:
線(xiàn)程pool-1-thread-1進(jìn)入羔味,當(dāng)前已有1
線(xiàn)程pool-1-thread-2進(jìn)入卡辰,當(dāng)前已有2
線(xiàn)程pool-1-thread-3進(jìn)入,當(dāng)前已有3
線(xiàn)程pool-1-thread-2離開(kāi)拱绑,當(dāng)前已有1
線(xiàn)程pool-1-thread-6進(jìn)入综芥,當(dāng)前已有3
線(xiàn)程pool-1-thread-3離開(kāi),當(dāng)前已有2
線(xiàn)程pool-1-thread-1離開(kāi)猎拨,當(dāng)前已有3
線(xiàn)程pool-1-thread-5進(jìn)入膀藐,當(dāng)前已有3
線(xiàn)程pool-1-thread-4進(jìn)入,當(dāng)前已有2

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末红省,一起剝皮案震驚了整個(gè)濱河市额各,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌吧恃,老刑警劉巖虾啦,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異痕寓,居然都是意外死亡傲醉,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)呻率,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)硬毕,“玉大人,你說(shuō)我怎么就攤上這事礼仗⊥驴龋” “怎么了逻悠?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)韭脊。 經(jīng)常有香客問(wèn)我童谒,道長(zhǎng),這世上最難降的妖魔是什么乾蓬? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任惠啄,我火速辦了婚禮,結(jié)果婚禮上任内,老公的妹妹穿的比我還像新娘撵渡。我一直安慰自己,他們只是感情好死嗦,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布趋距。 她就那樣靜靜地躺著,像睡著了一般越除。 火紅的嫁衣襯著肌膚如雪节腐。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,842評(píng)論 1 290
  • 那天摘盆,我揣著相機(jī)與錄音翼雀,去河邊找鬼。 笑死孩擂,一個(gè)胖子當(dāng)著我的面吹牛狼渊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播类垦,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼狈邑,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了蚤认?” 一聲冷哼從身側(cè)響起米苹,我...
    開(kāi)封第一講書(shū)人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎砰琢,沒(méi)想到半個(gè)月后蘸嘶,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡氯析,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年亏较,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掩缓。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡雪情,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出你辣,到底是詐尸還是另有隱情巡通,我是刑警寧澤尘执,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站宴凉,受9級(jí)特大地震影響誊锭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜弥锄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一丧靡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧籽暇,春花似錦温治、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至绸狐,卻和暖如春卤恳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背寒矿。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工突琳, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人符相。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓本今,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親主巍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • 前言 多線(xiàn)程并發(fā)編程是Java編程中重要的一塊內(nèi)容挪凑,也是面試重點(diǎn)覆蓋區(qū)域孕索,所以學(xué)好多線(xiàn)程并發(fā)編程對(duì)我們來(lái)說(shuō)極其重要...
    嘟爺MD閱讀 7,309評(píng)論 21 272
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)躏碳,斷路器搞旭,智...
    卡卡羅2017閱讀 134,633評(píng)論 18 139
  • 一、多線(xiàn)程 說(shuō)明下線(xiàn)程的狀態(tài) java中的線(xiàn)程一共有 5 種狀態(tài)菇绵。 NEW:這種情況指的是肄渗,通過(guò) New 關(guān)鍵字創(chuàng)...
    Java旅行者閱讀 4,665評(píng)論 0 44
  • 以前出去玩,那是純玩咬最,現(xiàn)在則多了一份探究與尋覓翎嫡。世界那么大,不能光照相永乌,還要用眼去看惑申、用心去體會(huì)具伍。 今年夏天,兩岸...
    林之汐閱讀 627評(píng)論 0 3
  • 天下殺手圈驼,絕門(mén)七宗人芽, 這天下江湖有一個(gè)組織。名稱(chēng)绩脆。七宗萤厅,這七宗的第一門(mén)。也是宗主靴迫,花影凌暮惕味,一個(gè)16歲的女孩,因?yàn)?..
    顧涼諾閱讀 185評(píng)論 0 0