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

201711671106《Java程式設計》第十二章總結

第十二章:Java多執行緒機制

一:程序與執行緒

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

執行緒:比程序更小的執行單位,一個程序在其執行過程中,可以產生多個執行緒,形成多條執行線索。沒有程序就沒有執行緒。

主執行緒(main執行緒)

每個java程式都有一個預設的主執行緒main;在執行java程式時候,多個執行緒輪流執行。

執行緒的狀態:

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

在java中可有兩種方式實現多執行緒,一種是繼承Thread類,一種是實現Runnable介面

2.執行:用start()方法通知JVM加入新執行緒,並且重新執行緒中的run()方法,若執行緒是thread子類建立,則立即執行run()。

3.中斷:通常有4個原因:

(1)JVM將CPU資源從當前執行緒切換給其他執行緒,使本執行緒讓出CPU的使用權處於中斷狀態。
(2)執行緒使用CPU資源期間執行了sleep方法,使當前執行緒進入休眠狀態。
(3)執行緒使用CPU資源期間執行了wait( )方法,使得當前執行緒進入等待狀態。
(4)執行緒使用CPU資源期間執行某個操作進入阻塞狀態,比如執行讀/寫操作引起阻塞。

4.死亡:死亡後就不具有繼續執行的能力,通常有兩個原因:

1)正常執行的執行緒完成了他的全部工作

2)被強制性終止,run方法被強制結束

執行緒排程與優先順序:

java虛擬機器中的執行緒排程器負責管理執行緒,排程器把執行緒的優先順序分成10個級別,分別用thread類中的類變量表示。每個Java的執行緒的優先順序通常在1(Thread.MIN_PRORITY)-10(Thread.MAX_PRORITY)之間,若沒有明確設定執行緒的優先級別,則優先順序為5,即(Thread.NORM_PRORITY).優先順序可通過setPrority()調整。

Thread類與執行緒的建立

建立執行緒物件有兩種方法:

1.使用Thread子類方法建立執行緒物件,需要重寫父類中的Run()方法.。優點:可以在子類中增加新的成員變數,使執行緒具有某種屬性,也可以新增方法,具有某種功能。

2.直接用Thread方法建立。——Thread(Runnable target)引數是一個Runnable型別的引數。

目標執行緒與執行緒的關係:

1.目標物件和執行緒完全解耦 2.目標物件組合執行緒(弱耦合)-可以將執行緒作為自己的成員

執行緒常用的方法

1.Start():執行緒呼叫該方法啟動執行緒。注:呼叫後不能再呼叫。

2.run():定義執行緒物件被排程之後執行的操作。

3.Sleep(int millsecond):使執行緒休眠,休眠時間用引數決定。

4.isAlive():線上程新建狀態的時候,呼叫這個方法返回false;死亡後也是返回false;沒死前呼叫返回true。

5.currenThread():返回當前正在使用的執行緒

6.interrupt():吵醒休眠的執行緒。

執行緒同步:

若干個執行緒都需要使用一個synchronized(同步)修飾的方法,及程式中的若干個執行緒都需要使用一個方法,而這個方法用synchronized給與了修飾。多個執行緒都必須遵守機制。

執行緒同步機制:當一個執行緒A使用synchronized方法時,其他方法想使用這個方法必須等待,直到A用完。

協調同步的執行緒:

當一個執行緒使用的同步方法中用到某個變數,而此變數又需要其他執行緒修改後才能符合本執行緒的需要,那麼可以在同步方法中使用wait()方法。wait方法可以中斷執行緒的執行使本執行緒等待,暫時讓出CPU的使用權,並允許其他執行緒使用這個同步方法。在其他執行緒使用完這份方法後,用notifyAll()方法通知由於使用本方法而等待的執行緒結束等待。

注:wait()、nitify()和notifyAll()都是final方法,不允許繼承,切不可以在非同步方法中使用這三方法。

執行緒聯合:

線上程A佔有資源期間,可以讓其他執行緒呼叫join()和本執行緒聯合,如:B.join();稱A在執行期間聯合了B。這樣A的執行緒馬上中斷,直至B完成。

GUI執行緒:

在Java程式包括圖形使用者介面時候,虛擬機器會啟動更多執行緒如 AWT-EventQuecue和AWT-WIndows。

AWT-EventQuecue:處理GUI事件  

AWT-WIndows:負責將窗體或元件繪製到桌面。

計時器執行緒Timer:

構造方法:Timer(int a,Object b) 引數a是毫秒,b是計時器的監視器。

計時器次數設定:setRepeats(boolean b) b取false則只執行一次。

守護執行緒:

執行緒預設為非守護執行緒,稱作user使用者執行緒。呼叫void setDaemon(boolean on)方法將自己設定成一個守護執行緒。