1. 程式人生 > >JAVA中程序、執行緒

JAVA中程序、執行緒

程序與執行緒的概念

程序:一次程式的執行,是系統資源排程和分配的基本單位
執行緒:是程序中獨立執行的子任務,是CPU排程和分配的基本單位,執行緒被呼叫的時機是隨機的。
程序與執行緒的關係:
1.一個程序可以有多個執行緒,一個執行緒只能屬於一個程序
2.系統分配資源給程序,同一程序的執行緒共享該程序的資源
3.程序間可以併發執行,同一程序的執行緒也可以併發執行

程序的通訊方法

1.管道:具有親緣關係的執行緒可以互相通訊
2.有名管道:除具有管道的功能,非親緣關係的執行緒可以互相通訊
3.訊號:用於程序通訊以及傳送訊號給程序本身
4.訊號量:允許多個執行緒同時使用共享資源,限制同一時刻可以訪問資源的最大執行緒數目,用一個計數器來控制
5.訊息佇列:訊息的連結串列,具有讀許可權的執行緒可以讀走訊息佇列裡面的資訊,具有寫許可權的執行緒可以將資訊寫入訊息佇列裡面
6.共享記憶體:多個執行緒訪問同一塊記憶體空間(如傳遞檔案)
7.socket:不同機器間通訊

執行緒的通訊方式

1.鎖機制:1.互斥鎖(排他,一個時間只能有一個執行緒來運行當前模組)2.條件變數(與互斥鎖一同使用,以原子方式阻塞程序,直到某個特定條件為真)3.讀寫鎖(多個程序可以同時讀取共享資料,寫操作是互斥的)
2.訊號機制:用於執行緒間的通訊以及傳送訊號給執行緒本身
3.訊號量機制:無線執行緒訊號量與命名執行緒訊號量(沒有理解?)

三個概念:
1.臨界區:任一時刻只允許一個執行緒對共享資源進行訪問
2.互斥量:擁有互斥物件的執行緒才具有訪問資源的許可權,互斥量不僅在同一程序內的執行緒實現資源的共享訪問,不同程序的執行緒見也可以實現對共享資源的訪問
3.訊號量:允許多個執行緒對共享資源進行訪問,限定訪問共享資源的最大執行緒數目,相當於一個程式計數器

執行緒方法介紹

1.currentThread():返回當前程式碼正在被那個執行緒呼叫的資訊
2.isAlive():判斷當前執行緒是否處於活動狀態。活動狀態是指執行緒已經啟動且尚未終止。
3.sleep(long time):讓當前正在執行的執行緒在指定毫秒數內休眠(暫停行為)。
3.getId():獲得當前執行緒的唯一id
4.interrupt():停止當前執行緒,但並不是真的停止執行緒,只是在當前執行緒打了一個停止標記
5.suspend():當前執行緒掛起(暫停執行緒)
6.resume():恢復執行緒的執行。注:使用這兩個方法可能會造成公共同步物件被獨佔以及資料不同步。
7.yield():放棄當前CPU資源,將其讓給其他任務去佔用CPU執行時間,放棄時間不確定
8.setPriority():設定執行緒優先順序,優先順序較高的執行緒得到的CPU資源較多,特性:繼承性(子類可繼承父類的優先順序)、規則性(CPU儘量將執行資源讓給優先順序較高的執行緒)、隨機性(優先順序較高的執行緒並不一定先執行完任務)
9.join():阻塞直到子執行緒執行完畢
10.setDemon(true):守護執行緒。當程式只剩下守護執行緒的時候,虛擬機器就退出了,程式也沒必要執行了。JVM垃圾回收、記憶體管理等都是守護執行緒

執行緒的5大狀態

新建狀態:新建立的執行緒物件,還沒有執行start方法
可執行狀態:執行start方法,但還沒有執行run方法,開始搶奪CPU資源
執行狀態:獲得CPU資源,執行run方法
阻塞狀態:由於某種原因執行緒讓出了CPU資源,其處於可執行狀態的執行緒可以可以搶奪CPU資源來執行
死亡狀態:執行緒死亡(1.run方法正常退出自然死亡 2.非正常異常終止了run方法)

具體圖譜如下:

這裡寫圖片描述

實現執行緒的方法

1.繼承Thread類,重寫run方法
2.實現Runnable介面,重寫run方法,用實現的物件作為Thread建構函式的引數,即 new Thread(Runnable r);
3.實現Callable介面,重寫call方法,與Runnable相比,具有返回值,可以通過Future來獲得返回值(非同步)
Future future=Excutors.newSingleThreadExecutor().submit(new CallableDemo());
返回值:future.get();

start與run的區別

1.start相當於建立了一個新執行緒並且交於執行緒規劃器去執行,裡面呼叫了run方法
2.run方法並沒有建立新執行緒,只是在原執行緒來呼叫

停止執行緒的方法

1.執行緒正常退出,run方法完成結束
2.stop:強制退出:1.可能是的一些清理工作並沒有完成 2.強制釋放鎖可能會造成資料不同步
3.interrupt方法:使用interrupt來中斷執行緒,但並不是立即中斷,需要在while輪詢裡使用條件變數(boolean)或者interrupted(檢測執行緒是否中斷,重置標誌位為false)或者isInterrupted來控制中斷狀態(檢測執行緒是否中斷,不重置標誌位)

sleep與wait方法的區別

1.sleep是在Thread包下,而wait是在Object包下
2.sleep方法可以在任何地方使用,wait/notify/notifyAll只能在同步方法或者同步程式碼塊中使用(由於競爭條件的存在,若不在同步方法中執行,可能會出現錯誤)
3.sleep不會釋放鎖,而wait會釋放鎖

雙親委派模式

類載入器是JAVA執行時環境的一部分,負責動態載入JAVA類到JAVA虛擬機器的記憶體空間。層次結構為:啟動類載入器(bootstrap classloader)–擴充套件類載入器(extension classloader)–應用程式類載入器(system classloader).

雙親委派模式要求除了頂層的啟動類載入器以外,其他類載入器都應該有自己的父類載入器,當這些類收到載入請求時,首先將請求委派給父類進行載入,若父類無法載入,子類才會進行載入

好處:
1.避免重複載入,父類載入的子類就不需要進行載入
2.安全性。若我此時定義一個Integer來覆蓋預設Integer,初始化後就會出錯,但使用雙親委派模式後,則會載入JDK中的類而不會載入自定義類。