1. 程式人生 > >JAVA筆記:多線程面試題整理!

JAVA筆記:多線程面試題整理!

java 分布式 編程語言 程序員 面試

多線程有幾種實現方案,分別是哪幾種???

三種。
繼承Thread類
實現Runnable接口:Java不支持類的多重繼承,但允許你調用多個接口。所以如果你要繼承其他類,當然是調用Runnable接口好了。
線程與進程的區別???

線程是進程的子集,一個進程可以有很多線程,每條線程並行執行不同的任務。
不同的進程使用不同的內存空間,而所有的線程共享一片相同的內存空間。別把它和棧內存搞混,每個線程都擁有單獨的棧內存用來存儲本地數據
什麽是線程池? 為什麽要使用它???

創建線程要花費昂貴的資源和時間,如果任務來了才創建線程那麽響應時間會變長,而且一個進程能創建的線程數有限。為了避免這些問題,在程序啟動的時候就創建若幹線程來響應處理,它們被稱為線程池,裏面的線程叫工作線程。從JDK1.5開始,Java API提供了Executor框架讓你可以創建不同的線程池。比如單線程池,每次處理一個任務;數目固定的線程池或者是緩存線程池(一個適合很多生存期短的任務的程序的可擴展線程池)。

同步有幾種方式,分別是什麽???

兩種。
同步代碼塊:

技術分享圖片
同步代碼塊
同步方法:
技術分享圖片

同步方法
啟動一個線程是run()還是start()?它們的區別???

啟動線程用 start();
run(): 封裝了被線程執行的代碼,直接調用僅僅是普通方法的調用
start(): 啟動線程,並由JVM自動調用run()方法
註:start()方法被用來啟動新創建的線程,而且start()內部調用了run()方法,這和直接調用run()方法的效果不一樣。當你調用run()方法的時候,只會是在原來的線程中調用,沒有新的線程啟動,start()方法才會啟動新線程。
sleep()和wait()方法的區別???

sleep(): 必須指時間; 不釋放鎖。

wait(): 可以不指定時間,也可以指定時間; 釋放鎖。
技術分享圖片

區別比較
為什麽wait(),notify(),notifyAll()等方法都定義在Object類中???

因為這些方法的調用是依賴於鎖對象的,而同步代碼塊的鎖對象是任意鎖。
而Object代碼任意的對象,所以,定義在這裏面。
線程的生命周期???

新建(new):處於該狀態的時間很短暫。已被分配了必須的系統資源,並執行了初始化。表示有資格獲得CPU時間。調度器可以把該線程變為runnable或者blocked狀態
就緒(Runnable):這種狀態下只要調度器把時間片分配給線程,線程就能運行。處在這種狀態就是可運行可不運行的狀態
阻塞(Bolocked):線程能夠運行,但有個條件阻止它的運行。當線程處於阻塞狀態時,調度器將會忽略線程,不會分配給線程任何CPU時間(例如sleep)。只有重新進入了就緒狀態,才有可能執行操作。

死亡(Dead):處於死亡狀態的線程講不再是可調度的,並且再也不會得到CPU時間。任務死亡的通常方式是從run()方法返回。
一個任務進入阻塞狀態,可能有如下原因:
1.sleep
2.wait(),知道線程得到了notify()或者notifyAll()消息,線程才會進入就緒狀態。
3.任務在等待某個輸入/輸出完成
4.線程在試圖在某個對象上調用其同步控制方法,但是對象鎖不可用,因為另一個任務已經獲取了這個鎖。

技術分享圖片
線程生命周期圖解
如何避免死鎖???

Java多線程中的死鎖
死鎖是指兩個或兩個以上的進程在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。這是一個嚴重的問題,因為死鎖會讓你的程序掛起無法完成任務,死鎖的發生必須滿足以下四個條件:

技術分享圖片
死鎖發生的四個條件
避免死鎖最簡單的方法就是阻止循環等待條件,將系統中所有的資源設置標誌位、排序,規定所有的進程申請資源必須以一定的順序(升序或降序)做操作來避免死鎖。

JAVA筆記:多線程面試題整理!