1. 程式人生 > 其它 >多執行緒知識點

多執行緒知識點

1。在java中執行緒不是孤立的
2.併發可以提高處理事務的效率即在一段時間內可以處理或者完成更多的事情;並行是一種更為嚴格,更為理想的併發
3.執行緒的建立與啟動
在java中,建立一個執行緒就是建立有個Thread(或者其子類)類的物件
4.呼叫執行緒的start()方法來啟動,啟動執行緒的實質就是請求JVM執行相應的執行緒這個執行緒具體什麼時候執行是通過執行緒排程器(Scheduler)決定的
5.start()方法呼叫結束後,並不意味著子執行緒開始執行;新開啟的執行緒會執行run方法
6.如果開啟的多個執行緒,start()呼叫的順序並不一定就是執行緒啟動的順序
7.多執行緒執行結果與程式碼執行順序或者呼叫順序無關;多執行緒執行結果是隨機的
8.執行緒中的常用方法
cruuentThread():獲取當前執行緒。java中的任何一段程式碼都是執行在某個執行緒當中的,執行當前執行緒的程式碼就是當前執行緒;同一段程式碼可能被不同的執行緒執行,因此當前執行緒是相對的
Thread.setName()和Thread.getName():設定執行緒名稱和獲取執行緒名稱
isAlive():判斷當前執行緒是否處於活動狀態。活動狀態:執行緒已啟動並且尚未終止
sleep():讓當前執行緒休眠指定的毫秒數
getId():獲取執行緒的唯一標識。注意:當某個編號的執行緒執行結束後,該編號可能被後續建立的執行緒使用;重啟JVM後,同一個執行緒的編號可能不一樣
yield():Thread.yield()作用是放棄當前的CPU資源
setPriority():設定執行緒的優先順序
interrupt():可以中斷執行緒,注意呼叫interrupt()方法僅僅只是在當前執行緒打一個停止標誌,並不是真正的停止執行緒
setDaemon():
9.java執行緒的優先順序是1-10,如果超出這個範圍會丟擲異常IllegalArgumentException;執行緒優先順序本質上就是給執行緒排程器一個提示資訊以便於排程器決定先呼叫哪個執行緒,注意:不能保證優先順序高的執行緒一定先執行;java優先順序設定不當會導致某些執行緒永遠無法執行,即產生的執行緒飢餓,執行緒的優先順序並不是設定的越高越好
10.java中的執行緒分為使用者執行緒和守護執行緒,守護執行緒是為其他執行緒提供服務的執行緒,如垃圾回收器就是一個典型的 守護執行緒。守護執行緒是不能單獨執行的,當JVM中沒有其他使用者執行緒,只有守護執行緒時JVM會推出,守護執行緒會自動銷燬
11.執行緒的生命週期(重點)
執行緒的生命週期就是一個執行緒從建立到銷燬的整個過程
執行緒的生命週期可以通過getState()獲得,執行緒的狀態是通過Thread.State列舉型別來定義的,有以下幾種狀態:
NEW:新建狀態,建立了執行緒物件,在呼叫start()啟動之前的狀態
RUNNABLE:可執行狀態。它是一個複合狀態,包含READY(表示該執行緒可以被執行緒排程器進行排程使他處於RUNNING狀態)和RUNNING(表示該執行緒正在執行)。Thread.yield()可以把執行緒有RUNNING狀態轉換為READY狀態
BLOCKED:阻塞狀態執行緒發起一個阻塞的IO操作或者申請有其他執行緒獨佔資源,執行緒會轉換為BLOCKED阻塞狀態。處於阻塞狀態的執行緒不會佔用CPU。當阻塞IO操作執行完或者執行緒獲得了其申請的資源。執行緒可以轉換為RUNNABLE狀態
WAITING:等待狀態。執行緒執行了object.wait()或者Thread.join()方法會把執行緒轉換為WAITING等待狀態,執行object.notify()或者加入的執行緒執行完畢,當前執行緒會轉換為RUNNABLE狀態
TIMED_WAITING狀態與WAITING狀態類似都是等待狀態出別在於處於該狀態的執行緒不會無限的等待,如果執行緒沒有在指定的時間內完成期望的操作,該執行緒自動轉換為RUNNABLE
TERMINATED:終止狀態,執行緒結束處於終止狀態
12.多執行緒的優勢與存在的風險
優勢:可以提高系統的吞吐率,多執行緒可以是一個進行有多個併發的操作;提高響應速度,web伺服器會採用一些專門的執行緒負責使用者的請求,縮短了使用者的等待時間;充分的利用了多核處理器資源。通過多執行緒可以充分利用CPU
風險:執行緒安全問題多執行緒共享資料時,如果沒有采取正確的併發訪問控制措施,就可能會產生資料一致性問題 ;執行緒活性問題,由於程式自身的缺陷或者由資源稀缺性導致執行緒一直處於非RINNABLE狀態
常見的活性故障:死鎖問題(鷸蚌相爭);鎖死(睡美人,王子死了);活鎖(貓咬尾巴);飢餓
上下文切換。處理器從執行一個執行緒切換到執行另一個執行緒
可靠性。可能由一個執行緒導致JVM意外終止,其他執行緒也無法執行
13.執行緒安全問題
非執行緒安全主要是指多個執行緒對同一個物件的例項變數進行操作,會出現值被更改,值不同步的情況
執行緒的安全性問題表現為三個方面:原子性、可見性、有序性 。
原子性:原子就是不可分割的意思。原子不可分割有兩層含義一個是訪問(讀寫)某個共享變數的操作從其他執行緒來看,該執行緒要麼執行完畢,要麼尚未發生,即其他執行緒看不到當前操作的中間結果;另一個訪問同一組共享變數的原子操作是不能交叉的
java中有兩種方式實現原子性:一種是使用鎖;另一個是利用處理器的CAS指令。鎖具有排他性,保證共享變數在某一個時刻只能被一個執行緒訪問;CAS指令直接在硬體層次上實現