Java 多線程 (三)

  • 線程通信

 

多線程併發執行時, 在默認狀況下CPU是隨機切換線程, 若是但願線程執行的順序按咱們的規律執行, 就須要線程之間協調通信java

 

線程通信方式多線程

  • 休眠喚醒方式
  1. -- Object: wait、notify、notifyAll(以上必須配合synchronized塊使用)    
  2. -- Condition(Lock.newCondition()): await、signal、signalAll
  • CountDownLatch: 用於某個線程等待其餘線程執行完後再執行

CountDownLatch底層原理是經過一個計數器來實現的, 計數器的初始值爲(等待)線程的數量, 執行減一操做, 到0後意味着某個線程就能夠執行了併發

好比A線程等待前面有3個線程執行完成後再執行, 計數器標記count=3, 第一步執行await()方法等待檢查當前的count是不是0, 不是0 ,則A線程阻塞, 在其餘3個線程執行時各自分別調用countDown()方法, 對count-1操做, 直到count=0, 就去喚醒(resume())A線程工做學習

  • CyclicBarrier: 一組線程等待至某個狀態以後再所有同時執行

CyclicBarrier 底層基於 ReentrantLock 和 Condition 實現spa

  • Semaphore: 用於控制對某組資源的訪問權限 (適合資源少,線程多的場景) 

 

wait 和 sleep 區別線程

  wait sleep
同步 只能在synchronized同步塊中使用 不須要依賴synchronized
做用對象 wait方法定義在Object類中,做用於對象自己 sleep方法定義在java.lang.Thread中,做用當前線程
釋放鎖資源 不會
喚醒條件 其餘線程調用對象的notify或notifyAll 超時或調用interrupt()
方法屬性 實例方法(Object.wait()) 靜態方法

 

                                                                                                                Go. 學習線程 還須要瞭解Java內存模型 也是核心基礎對象

相關文章
相關標籤/搜索