CountDownLatch闭锁,join和yield的区别
生活随笔
收集整理的這篇文章主要介紹了
CountDownLatch闭锁,join和yield的区别
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
CountDownLatch閉鎖
CountDownLatch是一個(gè)同步工具類,join的增強(qiáng)版。允許一個(gè)或多個(gè)線程,等待其他一組線程完成操作,再繼續(xù)執(zhí)行
- public CountDownLatch(int count); 構(gòu)造函數(shù),初始化計(jì)數(shù)器值為count,count只能被設(shè)置一次
- public void await()throws InterruptedException; 調(diào)用await()方法的線程會(huì)被掛起,直到count值為0才繼續(xù)執(zhí)行
- public boolean await(longtimeout, TimeUnit unit)throws InterruptedException; 和await()類似,只不過等待一定的時(shí)間后count值還沒變?yōu)?的話就會(huì)繼續(xù)執(zhí)行
- public void countDown();將count值減1
它是通過控制計(jì)數(shù)器的值來達(dá)到等待的目的。當(dāng)計(jì)數(shù)器的值>0時(shí),countDownLatch.await()會(huì)阻塞當(dāng)前線程,直到其他線程調(diào)用countDownLatch.countDown()將計(jì)數(shù)器的值減到0時(shí),阻塞線程將被喚醒。計(jì)數(shù)器的值>0時(shí)調(diào)用await()方法不會(huì)阻塞當(dāng)前線程。主線程必須在啟動(dòng)其他線程后立即調(diào)用CountDownLatch.await()方法。這樣主線程的操作就會(huì)在這個(gè)方法上阻塞,直到其他線程完成各自的任務(wù)。
join阻塞當(dāng)前線程等待線程
t.join()方法:阻塞調(diào)用此方法的線程(calling thread)進(jìn)入TIMED_WAITING狀態(tài),直到線程t完成,此線程再繼續(xù);通常用于在main()主線程內(nèi),等待其它線程完成再結(jié)束main()主線程
- Join方法實(shí)現(xiàn)是通過wait()。?當(dāng)main線程調(diào)用t.join時(shí)候,main線程會(huì)獲得線程對(duì)象t的鎖(wait意味著拿到該對(duì)象的鎖),調(diào)用該對(duì)象的wait(),直到該對(duì)象喚醒main線程?,比如退出后。這就意味著main線程調(diào)用t.join時(shí),必須能夠拿到線程t對(duì)象的鎖。
join與countDownLatch區(qū)別
- join用于讓當(dāng)前執(zhí)行線程等待join線程執(zhí)行結(jié)束。
- 其實(shí)現(xiàn)原理是不停檢查join線程是否存活,如果join線程存活則讓當(dāng)前線程永遠(yuǎn)wait。
- countDownLatch沒有這個(gè)線程,只要count減小到0,不管被等待線程是否執(zhí)行結(jié)束,等待線程都可以繼續(xù)執(zhí)行(被喚醒,進(jìn)入可執(zhí)行狀態(tài))。
yield與join方法的區(qū)別
yield()方法:暫停當(dāng)前正在執(zhí)行的線程對(duì)象,并允許執(zhí)行其他線程。
- yield()應(yīng)該做的是讓當(dāng)前運(yùn)行線程回到可運(yùn)行狀態(tài),以允許具有相同優(yōu)先級(jí)的其他線程獲得運(yùn)行機(jī)會(huì)。因此,使用yield()的目的是讓相同優(yōu)先級(jí)的線程之間能適當(dāng)?shù)妮嗈D(zhuǎn)執(zhí)行。但是,實(shí)際中無法保證yield()達(dá)到讓步目的,因?yàn)樽尣降木€程還有可能被線程調(diào)度程序再次選中。
結(jié)論:yield()從未導(dǎo)致線程轉(zhuǎn)到等待/睡眠/阻塞狀態(tài)。在大多數(shù)情況下,yield()將導(dǎo)致線程從運(yùn)行狀態(tài)轉(zhuǎn)到可運(yùn)行狀態(tài),但有可能沒有效果。
join()方法:線程實(shí)例的join()方法可以使得一個(gè)線程在另一個(gè)線程結(jié)束后再執(zhí)行,即也就是說使得當(dāng)前線程可以阻塞其他線程執(zhí)行;
- thread.Join把指定的線程加入到當(dāng)前線程,可以將兩個(gè)交替執(zhí)行的線程合并為順序執(zhí)行的線程。比如在線程B中調(diào)用了線程A的Join()方法,直到線程A執(zhí)行完畢后,才會(huì)繼續(xù)執(zhí)行線程B。
總結(jié)
以上是生活随笔為你收集整理的CountDownLatch闭锁,join和yield的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实验吧CTF逆向题1000writeup
- 下一篇: Objective-c中的占位符,打印B