前面介紹了線程的一些基本知識,現在來說下線程的讓步,阻塞,和同步
先說說讓步
所謂讓步,就是讓調用者的線程暫停,讓其他線程重新競争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
主線程正在執行
可以看出新開的線程和主線程不會出現互相交替出現的時候了,因為新開線程阻塞了主線程,隻有等到該線程全部執行完畢的時候,才會執行主線程
關于線程的東西就先說到這裡了。