天天看點

java進階07 線程的讓步與阻塞與同步

  前面介紹了線程的一些基本知識,現在來說下線程的讓步,阻塞,和同步

  先說說讓步

  所謂讓步,就是讓調用者的線程暫停,讓其他線程重新競争cpu,包括調用者。

  先看看代碼

  

  我們來分析下該代碼

  代碼中的thread.yield()就是讓步的函數,這裡循環30次 當i為5的倍數的時候 讓步 同時打出 重新競争cpu的字段

  那我們期待的結果就是這樣的形式:

  線程1正在執行1

  線程1正在執行2

  線程1正在執行3

  線程1正在執行4

  線程1正在執行5

  重新競争cpu

  線程1正在執行6

  線程1正在執行7

  線程1正在執行8

  線程1正在執行9

  線程1正在執行10

  那我們來看看真正打出結果:

  線程2正在執行1

  線程2正在執行2

  線程2正在執行3

  線程2正在執行4

  線程2正在執行5

  線程2正在執行6

  線程2正在執行7

  線程2正在執行8

  線程2正在執行9

  這可跟我們期待的值差太多了。

  這是什麼原因呢? 還是由于cpu的配置設定的問題,cpu配置設定是随機的,什麼時候目前線程被其他線程搶去也不奇怪。

  還有可能出現這種結果:

  這就是當程式i=5的倍數時,運作完system.out.println(thread.currentthread().getname()+"正在執行"+i);

  該線程就被擠出去了,導緻 for裡面都隻運作了一半.

  而為了處理這種情況,提供了一種叫同步的東西:

  所謂線程同步,就是在一段程式執行的過程中,無論成功還是失敗,其他線程都會等待這段程式的執行完畢,才會轉入其他線程

  這樣可以保證程式的完整性和安全性。

  java裡用synchronsized關鍵值實作

  它既可以修飾代碼塊,又可以修飾函數。

  輸出結果:

  這就達到了我們想要的結果。

  最後講到的就是線程的阻塞。

  調用thread.join()會 阻塞目前線程,直至調用者的線程執行完畢之後,才執行其他線程,相當于将cpu全部分給調用者的線程。進而達到控制線程的先後順序

  輸出結果:

  線程1正在執行9998

  線程1正在執行9999

  主線程正在執行

  可以看出新開的線程和主線程不會出現互相交替出現的時候了,因為新開線程阻塞了主線程,隻有等到該線程全部執行完畢的時候,才會執行主線程

  關于線程的東西就先說到這裡了。

上一篇: bat 棧上限
下一篇: js prototype