1. 程式人生 > >【java面試】執行緒篇

【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)

:阻塞狀態是執行緒因為某種原因放棄CPU使用權,暫時停止執行。直到執行緒進入就緒狀態,才有機會轉到執行狀態。

阻塞的情況分三種:

(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資源,釋放鎖