java第12章學習總結
Java中的執行緒
多執行緒是指一個應用程式中同時存在幾個執行體,按幾條不同的執行線索共同工作的情況。
1.1主執行緒
每個Java應用程式都會有一個預設的主執行緒。當JVM載入程式碼,發現main方法之後,就會啟動一個執行緒,這個執行緒稱為“主執行緒”(main執行緒),該執行緒負責執行main方法。在main方法中再建立的執行緒,就稱為程式中的其它執行緒。JVN要等到Java應用程式中的所有執行緒都結束之後,才結束Java應用程式。
1.2執行緒的狀態與生命週期
Java語言使用Thread類及其子類的物件來表示執行緒。
新建
當一個Thread類或其子類的物件被宣告並建立時,新生的執行緒物件處於新建狀態。此時,它已經有了相應的記憶體空間和其他資源。
執行
當JVM將CPU使用權切換給該執行緒時,此執行緒就可以脫離建立它的主執行緒獨立開始自己的生命週期。
中斷
CPU資源被切換給其他執行緒
執行了sleep(int millsecond)方法,執行緒進入休眠狀態。
執行了wait()方法,執行緒進入等待狀態。
執行某個操作進入阻塞狀態。
死亡
處於死亡狀態的執行緒不具有繼續執行的能力。死亡原因有兩個,一個是正常執行的執行緒完成了它的全部工作;另一個是執行緒被提前終止。
1.3執行緒排程與優先順序
JVM的執行緒排程器的任務是使高優先順序的執行緒能始終執行,一旦時間片有空閒,則使具有同等優先順序的執行緒以輪流的方式順序使用時間片。
要等到高優先順序執行緒執行完畢今日死亡狀態,才會在其他優先順序的執行緒中輪流切換。
Thread類與執行緒的建立
2.1使用Thread的子類
用Thread類或子類建立執行緒物件。
2.2使用Thread類
優點:可以在子類中增加新的成員變數,使執行緒具有某種屬性,也可以在子類中新增加方法,使執行緒具有某種功能。
建立執行緒的另一個途徑就是用Thread類直接建立執行緒物件。
對於Thread(Runnable target)構造方法建立的執行緒,輪到 它來享用CPU資源時,目標物件就會自動呼叫介面中的run()方法。
2.3目標物件與執行緒的關係
(1)目標物件和執行緒完全解耦
(2)目標物件組合執行緒(弱耦合)
3.執行緒的常用方法
(1)strat()
執行緒呼叫該方法將啟動執行緒,使之從新建狀態進入就緒佇列排隊,一旦輪到它來享用CPU資源時,就可以脫離建立它的執行緒獨立開始自己的生命週期了。
只有處於新建狀態的執行緒才可以呼叫start()方法。
(2)run()
Thread類的run()方法與Runnable介面中的run()方法的功能和作用相同,都用來定義執行緒物件被排程之後所執行的操作。
線上程沒有結束run()方法之前,不贊成讓執行緒再呼叫start()方法,否則將發生異常。
(3)sleep(int millsecond)
當高級別的執行緒未死亡時,低級別執行緒沒有機會獲得CPU資源。當優先順序高的執行緒需要優先順序低的執行緒做一些工作來配合它,或者優先級別高的執行緒需要完成一些費時的操作,此時優先順序高的執行緒應該讓出CPU資源,使優先順序低的執行緒有機會執行。需要在run()方法中呼叫sleep()方法來使自己放棄CPU資源。必須在try-catch語句塊中呼叫sleep方法。
(4)isAlive()
執行緒處於新建狀態時,執行緒呼叫isAlive()方法返回false。沒有進入死亡狀態之前,執行緒呼叫isAlive()方法返回true。當執行緒進入死亡狀態後,執行緒仍可以呼叫方法isAlive(),這時返回的值是false。
一個已經執行的執行緒在沒有進入死亡狀態時,不要再給執行緒分配實體,由於執行緒只能引用最後分配的實體,先前的實體就會成為“垃圾”,並且不會被垃圾收集器收集掉。
currentThread()
currentThread()方法是Thread類中的類方法,可以用類名呼叫,該方法返回當前正在使用CPU資源的執行緒。
interrupt()
interrupt方法經常用來“吵醒”休眠的執行緒。
4.執行緒同步
所謂執行緒同步就是若干個執行緒都需要使用一個synchronized(同步)修飾的方法,即程式中的若干個執行緒都需要使用一個方法,而這個方法用synchronized方法給予修飾。多個執行緒呼叫synchronized方法必須遵守同步機制。
當一個執行緒使用synchronized方法時,其他執行緒想使用這個synchronized方法時就必須等待,直到前一個執行緒使用完該synchronized方法。
5.協調同步的執行緒
當一個執行緒使用的同步方法中用到某個變數,而此變數又需要其他執行緒修改後才能符合本執行緒的需要,那麼可以在同步方法中使用wait()方法。Wait方法可以中斷執行緒的執行,使本執行緒等待,暫時讓出CPU的使用權,並允許其他執行緒使用這個同步方法。
6.執行緒聯合
一個執行緒在佔有CPU資源期間,可以讓其他執行緒呼叫join()和本執行緒聯合。一旦聯合另外的執行緒,那麼此執行緒將立刻中斷執行,一直等到它聯合的執行緒執行完畢,再重新排隊等待CPU資源,以便恢復執行。
7.GUI執行緒
AWT-EventQuecue執行緒負責處理GUI事件,AWT-Windows執行緒將負責將窗體或元件繪製到桌面。
8.計時器執行緒
當某些操作需要週期性地執行,就可以使用計時器。
建立後,使用Timer類的方法strat()啟動計時器,即啟動執行緒。Stop()停止計時器,即掛起執行緒。使用restart()重啟計時器,即恢復執行緒。
計時器的監視器必須是元件類的子類的例項,否則計時器無法啟動。
9.守護執行緒
執行緒預設是非守護執行緒,也成使用者執行緒,一個執行緒呼叫void setDaemon(Boolean on)方法可以將自己設定成一個守護執行緒。
當初程式中所有使用者執行緒都已執行結束時,即守護執行緒的run方法還有需要執行的語句,守護執行緒也立刻結束執行。