【java面試】執行緒篇
1.什麼是執行緒?
執行緒是作業系統能夠進行運算排程的最小單位,它被包含在程序之中,是程序中的實際運作單位。
2.執行緒和程序有什麼區別?
執行緒是程序的子集,一個程序可以有很多執行緒,每條執行緒並行執行不同的任務。不同的程序使用不同的記憶體空間,而所有的執行緒共享一片相同的記憶體空間。
3.如何在Java中實現執行緒?
一共有三種方式: 1.繼承Thread類 2.實現Runnable介面,重寫run方法 2.實現Callable介面,重寫call方法(可以返回值和丟擲異常) 4.用Runnable還是Thread? 在java中不支援多繼承,支援多實現,如果該類需要繼承其它類,則選擇Runnable;5.Thread 類中的start() 和 run() 方法有什麼區別?
start()方法被用來啟動新建立的執行緒,使程序就緒狀態,而run()方法,執行執行緒,使執行緒進入執行狀態。 6.執行緒的幾種狀態1、新建狀態(New):新建立了一個執行緒物件。
2、就緒狀態(Runnable):執行緒物件建立後,其他執行緒呼叫了該物件的start()方法。該狀態的執行緒位於“可執行執行緒池”中,變得可執行,只等待獲取CPU的使用權。即在就緒狀態的程序除CPU之外,其它的執行所需資源都已全部獲得。
3、執行狀態(Running):就緒狀態的執行緒獲取了CPU,執行程式程式碼。
4、阻塞狀態(Blocked)
阻塞的情況分三種:
(1)、等待阻塞:執行的執行緒執行wait()方法,該執行緒會釋放佔用的所有資源,JVM會把該執行緒放入“等待池”中。進入這個狀態後,是不能自動喚醒的,必須依靠其他執行緒呼叫notify()或notifyAll()方法才能被喚醒,
(2)、同步阻塞:執行的執行緒在獲取物件的同步鎖時,若該同步鎖被別的執行緒佔用,則JVM會把該執行緒放入“鎖池”中。
(3)、其他阻塞:執行的執行緒執行sleep()或join()方法,或者發出了I/O請求時,JVM會把該執行緒置為阻塞狀態。當sleep()狀態超時、join()等待執行緒終止或者超時、或者I/O處理完畢時,執行緒重新轉入就緒狀態。
5、死亡狀態(Dead):執行緒執行完了或者因異常退出了run()方法,該執行緒結束生命週期。
7.執行緒同步的幾種方法 1.synchronized關鍵字修飾語句塊或者修飾方法 2.volatile關鍵字修飾變數3.使用重入鎖Lock
ReentrantLock類是可重入、互斥、實現了Lock介面的鎖,
它與使用synchronized方法和快具有相同的基本行為和語義,並且擴充套件了其能力
ReenreantLock類的常用方法有:
ReentrantLock() : 建立一個ReentrantLock例項
lock() : 獲得鎖
unlock() : 釋放鎖
注:ReentrantLock()還有一個可以建立公平鎖的構造方法,但由於能大幅度降低程式執行效率,不推薦使用
4.使用執行緒本地變數 ThreadLocal
5.使用阻塞佇列實現執行緒同步(java.util.concurrent包中提供的類)
8.volatile與synchronized的區別
1)volatile本質是在告訴jvm當前變數在暫存器中的值是不確定的,需要從主存中讀取,synchronized則是鎖定當前變數,只有當前執行緒可以訪問該變數,其他執行緒被阻塞住.
2)volatile僅能使用在變數級別,synchronized則可以使用在變數,方法.
3)volatile僅能實現變數的修改可見性,而synchronized則可以保證變數的修改可見性和原子性.
4)volatile不會造成執行緒的阻塞,而synchronized可能會造成執行緒的阻塞.
9.終止執行緒的3中方式 1.執行緒正常執行完畢,正常退出。 2.使用while()迴圈在特定條件下退出。 3.使用interrupt方法終止執行緒。 10. 什麼是執行緒池? 為什麼要使用它?建立執行緒要花費昂貴的資源和時間,如果任務來了才建立執行緒那麼響應時間會變長,而且一個程序能建立的執行緒數有限。為了避免這些問題,在程式啟動的時候就建立若干執行緒來響應處理,它們被稱為執行緒池,裡面的執行緒叫工作執行緒。如果併發的執行緒數量很多,並且每個執行緒都是執行一個時間很短的任務就結束了,這樣頻繁建立執行緒就會大大降低系統的效率,因為頻繁建立執行緒和銷燬執行緒需要時間。執行緒池使得執行緒可以複用,就是執行完一個任務,並不被銷燬,而是可以繼續執行其他的任務。執行緒池主要作用是便於管理執行緒,節約時間與資源。
11.執行緒死鎖
兩個或兩個以上的執行緒爭奪共享資源,並各自不釋放手中的資源,而造成死鎖。
解決辦法:1.讓所有的執行緒按照一定的順序獲得一組鎖;2.將多個鎖組成一組並放到一個鎖裡。
12.sleep()和wait()的區別
sleep()使執行緒暫停一段時間,佔用CUP資源,沒用釋放鎖
wait()使執行緒進入等待池中,釋放CPU資源,釋放鎖