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