多線程并發(fā)同步業(yè)務(wù)場(chǎng)景與解決方案

1)semaphore 信號(hào)量 (控制并發(fā)數(shù))

業(yè)務(wù)場(chǎng)景1:假如現(xiàn)在有10個(gè)人去同一家公司面試,但是只有3個(gè)面試官,那么同一時(shí)間只有2個(gè)人面試撬即,當(dāng)3個(gè)人中的任意一個(gè)面試結(jié)束之后端壳,等待的7個(gè)人又會(huì)有一個(gè)人可以去面試。

需求分析:人數(shù)=線程數(shù)?????面試官=資源?????? 正在面試=線程正在執(zhí)行

?????????? ?面試結(jié)束=線程執(zhí)行結(jié)束?????????? 等待面試人數(shù)=線程阻塞

解決方案:信號(hào)量 semaphore

代碼Demo:

public class SemaphoreTest implements Runnable {

private int num;

private Semaphore semaphore;

public SemaphoreTest(int num,Semaphore semaphore){

?????????? ?this.num=num;

??????????? this.semaphore=semaphore;

}

public void run() {

?try {

??? semaphore.acquire();//獲取信號(hào)量許可韩玩,才能進(jìn)入

?? ?System.out.println("面試者"+num+"進(jìn)入房間……");

??? Thread.sleep((long)Math.random()*10000);

?? System.out.println("面試者"+num+"交談中……");

?? Thread.sleep((long)Math.random()*10000);

? System.out.println("面試者"+num+"離開(kāi)房間……");

????? semaphore.release();//釋放信號(hào)量許可

?} catch (InterruptedException e) {

????? e.printStackTrace();

} }

public static void main(String[] args) {

???? final Semaphore s=new Semaphore(3);//并發(fā)數(shù)為3

??? ?ExecutorService threadPool=Executors.newCachedThreadPool();//線程池

?? ?for(int i=0;i<10;i++){

???????? ?threadPool.execute(new SemaphoreTest((i+1),s));

}

??? threadPool.shutdown();

} }

2)Cyclicbarrier? 同步屏障(用于多線程計(jì)算數(shù)據(jù)垒玲,最后合并計(jì)算結(jié)果)

業(yè)務(wù)場(chǎng)景2:公司周末組織去聚餐、首先各自從家里出發(fā)到聚餐地點(diǎn)找颓,當(dāng)所有人全部到齊之后才開(kāi)始吃飯合愈,如果未到齊,到的人就只能等待在那里击狮,直到所有人都到達(dá)之后佛析,才可以一起做事。

案例代碼:

public class CyclicbarrierDemo {

public static void main(String[] args) {

?final CyclicBarrier cb=new CyclicBarrier(3,new Runnable() {

?public void run() {

?????????? System.out.println("吃飯前彪蓬,一起做的事情"); } });

????????????ExecutorService threadPool=Executors.newCachedThreadPool();//線程池

???????? ?for(int i=0;i<3;i++){

??????????? final int user=i+1;

???????????????????????? Runnable r=new Runnable() {

?????????????????????????? public void run() {

??????????????????????????????? try {

???????????????????????????????????? Thread.sleep((long)Math.random()*10000);

????????????????????????????????????? ?System.out.println(user+"到達(dá)聚餐地點(diǎn)寸莫,當(dāng)前已有"+(cb.getNumberWaiting()+1)+"人到達(dá)");

??????????????????????? cb.await();//等待,只有當(dāng)線程都到達(dá)之后档冬,才能往下走

?????????????????????? if(user==1){ System.out.println("人員到齊"); }

????????????????????????? Thread.sleep((long)Math.random()*10000);

??????????????????????? System.out.println(user+"吃完飯储狭,回家……");

?//dosometing

?} catch (Exception e) {

?e.printStackTrace(); } } };

?threadPool.execute(r);

?}

threadPool.shutdown();

?} }

3)Exchanger 線程之間交換數(shù)據(jù)

public class ExchangerDemo {

public static void main(String[] args) {

final Exchangerexchanger=new Exchanger();

?ExecutorService threadPool=Executors.newCachedThreadPool();//線程池

threadPool.execute(new Runnable() {

public void run() { String sc="a";

?try {

String js=exchanger.exchange(sc);//js=b

?} catch (InterruptedException e) { e.printStackTrace(); } } });

?threadPool.execute(new Runnable() {

?public void run() {

String sc="b";

try { String js=exchanger.exchange(sc);//js=a

?} catch (InterruptedException e) { e.printStackTrace(); } } }); } }

執(zhí)行后,連個(gè)線程的數(shù)據(jù)進(jìn)行了交換捣郊。

4)CountDownLatch 倒計(jì)時(shí)器

業(yè)務(wù)場(chǎng)景4:有一個(gè)任務(wù)a辽狈,他需要等待其他幾個(gè)任務(wù)(BCD)都執(zhí)行完畢之后才能來(lái)執(zhí)行這個(gè)任務(wù)。

public static void main(String[] args) throws InterruptedException {

final CountDownLatch latch=new CountDownLatch(3);

?new Thread(){

public void run() {

?System.out.println("子任務(wù)B"+Thread.currentThread().getName()+"正在執(zhí)行"); latch.countDown();//倒計(jì)時(shí)減一

}; }.start();

new Thread(){

?public void run() {

System.out.println("子任務(wù)C"+Thread.currentThread().getName()+"正在執(zhí)行"); latch.countDown();//倒計(jì)時(shí)減一

?}; }.start();

new Thread(){

public void run() {

System.out.println("子任務(wù)D"+Thread.currentThread().getName()+"正在執(zhí)行"); latch.countDown();//倒計(jì)時(shí)減一

?}; }.start();

System.out.println("等待3個(gè)任務(wù)執(zhí)行完畢呛牲,"+Thread.currentThread().getName()+"組任務(wù)開(kāi)始執(zhí)行刮萌。");

latch.await();

System.out.println("繼續(xù)執(zhí)行主任務(wù)!");

}

CountDownLatch 與Cyclicbarrier 的區(qū)別:

1)共同點(diǎn):都能夠?qū)崿F(xiàn)線程之間的等待娘扩。

2)不同點(diǎn):

CountDownLatch :1)一般用于某個(gè)線程A等待其他若干線程執(zhí)行完任務(wù)后着茸,它才能執(zhí)行。2)它是不能夠重復(fù)用的琐旁。

Cyclicbarrier :1)一般用于一組線程互相等待涮阔,然后這一組線程同時(shí)執(zhí)行。2)它可以重復(fù)使用灰殴。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末敬特,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌伟阔,老刑警劉巖辣之,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異皱炉,居然都是意外死亡怀估,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門合搅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)多搀,“玉大人,你說(shuō)我怎么就攤上這事灾部】得” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵梳猪,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我蒸痹,道長(zhǎng)春弥,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任叠荠,我火速辦了婚禮匿沛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘榛鼎。我一直安慰自己逃呼,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布者娱。 她就那樣靜靜地躺著抡笼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪黄鳍。 梳的紋絲不亂的頭發(fā)上推姻,一...
    開(kāi)封第一講書(shū)人閱讀 49,764評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音框沟,去河邊找鬼藏古。 笑死,一個(gè)胖子當(dāng)著我的面吹牛忍燥,可吹牛的內(nèi)容都是我干的拧晕。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼梅垄,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼厂捞!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蔫敲,失蹤者是張志新(化名)和其女友劉穎饲嗽,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體奈嘿,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡貌虾,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了裙犹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尽狠。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖叶圃,靈堂內(nèi)的尸體忽然破棺而出袄膏,到底是詐尸還是另有隱情,我是刑警寧澤掺冠,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布沉馆,位于F島的核電站,受9級(jí)特大地震影響德崭,放射性物質(zhì)發(fā)生泄漏斥黑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一眉厨、第九天 我趴在偏房一處隱蔽的房頂上張望锌奴。 院中可真熱鬧,春花似錦憾股、人聲如沸鹿蜀。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)茴恰。三九已至,卻和暖如春斩熊,著一層夾襖步出監(jiān)牢的瞬間琐簇,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工座享, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留婉商,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓渣叛,卻偏偏與公主長(zhǎng)得像丈秩,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子淳衙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

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