1. 程式人生 > >201711671105 《Java程式設計》第十二章學習總結

201711671105 《Java程式設計》第十二章學習總結

教材學習內容總結

1、程序與執行緒

程序是程式的一次動態執行過程,它對應了從程式碼載入、執行至執行完畢的一個完整過程,這個過程也是程序本身從產生、發展至消亡的過程。

執行緒是比程序更小的執行單位,一個程序在其執行過程中,可以產生多個執行緒,形成多條執行線索,每條線索,即每個執行緒也有它自身的產生、存在和消亡的過程。

2、Java中的執行緒

2.1新建:

當一個Thread類或其子類的物件被宣告並建立時,新生的執行緒物件處於新建狀態。

2.2執行 :

執行緒必須呼叫start()方法(從父類繼承的方法)通知JVM,這樣JVM就會知道又有一個新一個執行緒排隊等候切換了。一旦輪到它來享用CPU資源時,此執行緒的就可以脫離建立它的主執行緒獨立開始自己的生命週期了。  

2.3中斷:

有4種原因的中斷:

JVM將CPU資源從當前執行緒切換給其他執行緒,使本執行緒讓出CPU的使用權處於中斷狀態。

執行緒使用CPU資源期間,執行了sleep(int millsecond)方法,使當前執行緒進入休眠狀。

執行緒使用CPU資源期間,執行了wait()方法。

執行緒使用CPU資源期間,執行某個操作進入阻塞狀態。

死亡 :處於死亡狀態的執行緒不具有繼續執行的能力。執行緒釋放了實體。

3、Thread類與執行緒的建立

在編寫Thread類的子類時,需要重寫父類的run()方法,其目的是規定執行緒的具體操作,否則執行緒就什麼也不做,因為父類的run()方法中沒有任何操作語句。

構造方法:

  Thread(Runnable target)   

該構造方法中的引數是一個Runnable型別的介面。

執行緒間可以共享相同的記憶體單元(包括程式碼與資料),並利用這些共享單元來實現資料交換、實時通訊與必要的同步操作。

 目標物件與執行緒的關係

1.目標物件和執行緒完全解耦

目標物件沒有組合執行緒物件.目標物件經常需要通過獲得執行緒的名字(因為無法獲得執行緒物件的引用)以便確定是哪個執行緒正在佔用CPU資源,即被JVM正在執行的執行緒。

2.目標物件組合執行緒(弱耦合)

目標物件可以組合執行緒.目標物件類組合執行緒物件時, 目標物件可以通過獲得執行緒物件的引用.

4、執行緒的常用方法:

start()   // 執行緒呼叫該方法將啟動執行緒,使之從新建狀態進入就緒佇列排隊,一旦輪到它來享用CPU資源時,就可以脫離建立它的執行緒獨立開始自己的生命週期了。

run()  //Thread類的run()方法與Runnable介面中的run()方法的功能和作用相同,都用來定義執行緒物件被排程之後所執行的操作,都是系統自動呼叫而使用者程式不得引用的方法。

sleep(int millsecond)  //優先順序高的執行緒可以在它的run()方法中呼叫sleep方法來使自己放棄CPU資源,休眠一段時間。  

isAlive()  // 執行緒處於“新建”狀態時,執行緒呼叫isAlive()方法返回false。線上程的run()方法結束之前,即沒有進入死亡狀態之前,執行緒呼叫isAlive()方法返回true。

currentThread()  //該方法是Thread類中的類方法,可以用類名呼叫,該方法返回當前正在使用CPU資源的執行緒。  

interrupt()   //一個佔有CPU資源的執行緒可以讓休眠的執行緒呼叫interrupt()方法“吵醒”自己,即導致休眠的執行緒發生InterruptedException異常,從而結束休眠,重新排隊等待CPU資源。     

5、執行緒同步

所謂執行緒同步就是若干個執行緒都需要使用一個synchronized修飾的方法。

在處理執行緒同步時,要做的第一件事就是要把修改資料的方法用關鍵字synchronized來修飾。

 6、協調同步的執行緒

wait()方法可以中斷方法的執行,使本執行緒等待,暫時讓出CPU的使用權,並允許其它執行緒使用這個同步方法。

notifyAll()方法通知所有的由於使用這個同步方法而處於等待的執行緒結束等待。曾中斷的執行緒就會從剛才的中斷處繼續執行這個同步方法,並遵循“先中斷先繼續”的原則。

notify()方法只是通知處於等待中的執行緒的某一個結束等待。

7、執行緒聯合

一個執行緒A在佔有CPU資源期間,可以讓其它執行緒呼叫join()和本執行緒聯合,如:

  B.join();

稱A在執行期間聯合了B。如果執行緒A在佔有CPU資源期間一旦聯合B執行緒,那麼A執行緒將立刻中斷執行,一直等到它聯合的執行緒B執行完畢,A執行緒再重新排隊等待CPU資源,以便恢復執行。如果A準備聯合的B執行緒已經結束,那麼B.join()不會產生任何效果。