日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CountDownLatch闭锁,join和yield的区别

發(fā)布時(shí)間:2023/12/8 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。