多線程面試題總結(jié)

1、什么是線程,什么是進程,它們有什么區(qū)別和聯(lián)系,一個進程里面是否必須有個線程

? ? ? ? 進程本質(zhì)是一個正在執(zhí)行的程序,一個進程可以有多個線程.線程是進程的最小執(zhí)行單位,一個進程至少有一個線程

區(qū)別:1:多進程程序不受java控制,而多線程則受java控制,

? ? ? ? 2:多線程比多進程需要更少的管理成本

2、實現(xiàn)一個線程有哪幾種方式,各有什么優(yōu)缺點,比較常用的是那種,為什么

? ? ? ? 實現(xiàn)一個線程有三種方式:

1)? ? ? 繼承Thread類,需要重寫run方法,無返回值

a)? ? ? ? 優(yōu)點:可以直接調(diào)用start方法啟動線程

b)? ? ? ? 缺點:java只能單繼承,如果已經(jīng)有了父類,不能用這種方法

2)? ? ? 實現(xiàn)Runnable接口,需要重寫run()方法

a)? ? ? ? 優(yōu)點:即使自己定義的線程類有了父類也可以實現(xiàn)接口,而且接口是多實現(xiàn)

b)? ? ? ? 缺點:需通過構(gòu)造一個Thread把自己傳進去,才能實現(xiàn)Thread的方法,代碼復(fù)雜

3)? ? ? 實現(xiàn)Callable接口,需要重寫call()方法

a)? ? ? ? 優(yōu)點:可以拋出異常,有返回值

b)? ? ? ? 缺點:只有jdk1.5以后才支持,結(jié)合FuntureTask和Thread類一起使用,最后調(diào)用start啟動線程

一般用第二種,實現(xiàn)Runnable接口,比較方便,擴展性高

3、一般情況下我們實現(xiàn)自己線程時候要重寫什么方法

? ? ? ? 使用Thread類,要重寫run()方法

? ? ? ? 實現(xiàn)Runnable接口時,要實現(xiàn)run()方法

? ? ? ? 使用Callable接口時,要重寫call()方法

4、start方法和run方法有什么區(qū)別,我們一般調(diào)用的那個方法,系統(tǒng)調(diào)用的是那個方法

? ? ? ? Start用來啟動線程

? ? ? ? 當(dāng)調(diào)用start后,線程并不會馬上運行,而是處于就緒狀態(tài),是否要運行取決于cpu

? ? ? ? Run用來子類重寫來實現(xiàn)線程的功能

? ? ? ? 我們一般調(diào)用的是start方法,系統(tǒng)調(diào)用的是run方法

5、sleep方法有什么作用,一般用來做什么

? ? ? ? Sleep是一個Thread類的靜態(tài)方法

? ? ? ? 作用:讓調(diào)用它的線程休眠指定的時間,用于暫停線程,但不會把線程鎖讓給其它線程,休眠時間結(jié)束,線程進入就緒狀態(tài),等待cpu分配的執(zhí)行機會

6、講下join,yield方法的作用,以及什么場合用它們

? ? ? ? Join()有嚴(yán)格的先后順序,調(diào)用它的線程需要執(zhí)行完,其它線程才會執(zhí)行

? ? ? ? Yield()是暫停當(dāng)前正在執(zhí)行的線程對象,把時間讓給其它線程

7、線程中斷是否能直接調(diào)用stop,為什么?

? ? ? ? 線程終端不能直接調(diào)用stop()方法

? ? ? ? Stop()方法是從外部強行終止一個線程,會導(dǎo)致不可預(yù)知的錯誤,比如線程鎖沒有歸還,io流不能關(guān)流? ? ? ? 線程只能調(diào)用interrupt()方法中斷,而且不是立即中斷,? ? ?只是發(fā)出了一個類似于信號量的東西,通過修改了被調(diào)用線程的中斷狀態(tài)來告知那個線程,說它被中斷了,至于什么時候中斷,這個系統(tǒng)會判斷)系統(tǒng)會在一個合適的時候進行中斷處理

8、列舉出一般情況下線程中斷的幾種方式,并說明他們之間的優(yōu)缺點,并且說明那種中斷方式最好

? ? ? ? 線程中斷有4種方式

由interrupt發(fā)出中斷信號,用戶接收中斷信號,通過isInterrupted判斷線程是否中斷

由interrupt發(fā)出中斷信號,系統(tǒng)接收中斷信號,通過sleep拋出中斷異常,并把中斷信號清除,只能拋出一次

用戶自定義中斷,將中斷信號發(fā)出,自己接收該中斷信號

調(diào)用interrupted(),會把中斷信號清除,并中斷線程

9、線程有幾種狀態(tài),他們是怎么轉(zhuǎn)化的

? ? ? ? 線程一般分為:新生,就緒,運行,阻塞,死亡五中狀態(tài)

? ? ? ? 當(dāng)創(chuàng)建一個線程后,并沒有運行,處于新生狀態(tài),需要通過調(diào)用start方法,讓線程處于就緒狀態(tài),但是否運行取決于cpu分配的執(zhí)行機會,當(dāng)?shù)玫絚pu的執(zhí)行機會后馬上運行,一個正在執(zhí)行的線程可以通過很多方式進入阻塞狀態(tài),當(dāng)執(zhí)行完所有操作后就進入死亡狀態(tài)

10、在實現(xiàn)Runnable的接口中怎么樣訪問當(dāng)前線程對象,比如拿到當(dāng)前線程的名字

? ? ? ? 通過Thread.currentThread().getName()可獲得當(dāng)前線程名字

11、講下什么是守護線程,以及在什么場合來使用它? ?

守護線程是用來監(jiān)聽其它線程是否掛掉,這個線程具有最低優(yōu)先級

用于為系統(tǒng)中的其它線程提供服務(wù)

守護線程就像象棋里的車馬相仕,非守護線程就是老帥,老帥掛掉,守護線程也就掛掉了

? ? ? ? 當(dāng)主線程和主線程創(chuàng)建的子線程全部退出,守護線程一定會跟著退出

? ? ? ? (比如QQ主程序和QQ聊天窗口,主程序退出,QQ聊天窗口也隨之關(guān)掉)

12、一般的線程優(yōu)先級是什么回事,線程優(yōu)先級高的線程一定會先執(zhí)行嗎?如果不設(shè)置優(yōu)先級的話,那么線程優(yōu)先級是多少,設(shè)置線程優(yōu)先級用那個函數(shù)

? ? ? ? 線程的優(yōu)先級就是設(shè)置哪個線程先執(zhí)行,但不是絕對,只是讓優(yōu)先級高的線程優(yōu)先運行的概率高一些,

? ? ? ? 線程默認(rèn)優(yōu)先級是NORM_PRIORITY = 5;

? ? ? ? 最小是 MIN_PRIORITY = 1;

? ? ? ? 最大是 MAX_PRIORITY = 10;

? ? ? ? 設(shè)置線程優(yōu)先級有setPriority()方法

13、為什么Thread里面的大部分方法都是final的

? ? ? ? 線程很多方法都是由系統(tǒng)調(diào)用的,不能通過子類重寫去改變他們的行為

14、什么是線程同步,什么是線程安全

? ? ? ? 同步:當(dāng)兩個或兩個以上的線程需要共享資源,通過同步方法限制資源在一次僅被一個線程占用

? ? ? ? 線程安全:線程安全就是多線程操作同一個對象不會產(chǎn)生數(shù)據(jù)污染,

? ? ? ? 線程同步一般來保護線程安全,final修飾的也是線程安全

15、講下同步方法和同步塊的區(qū)別,以及什么時候用它們

? ? ? ? 同步方法:被synchronized修飾的方法,同步整個方法,且整個方法都會被鎖住,同一時間只有一個線程可以訪問該方法,

? ? ? ? 同步塊: 被synchronized修飾的代碼塊,可以同步一小部分代碼

什么時候用?

? ? ? ? 同步塊越小性能越好,當(dāng)性能要求比較高,用同步代碼塊

16、簡單說下Lock對象的實現(xiàn)類的鎖機制和同步方法或同步塊有什么區(qū)別

? ? ? ? 是JDK1.5才出現(xiàn)的,Lock對象比synchronized更加靈活,可以控制什么時候上鎖,什么時候解鎖,而使用synchronized必須等代碼執(zhí)行完才會解鎖.

? ? ? ?Synchronized在鎖定時如果方法塊拋出異常,JVM會自動釋放鎖,而Lock出現(xiàn)異常必須在finally將鎖釋放,否則將引起死鎖

17、同步塊里面的同步監(jiān)視器是怎么寫的,默認(rèn)的同步方法里面的同步監(jiān)視器是那個

? ? ? ? Synchronized(對象){

? ? ? ? ? ? ? ? ? ? ? ? //代碼塊

? ? ? ? }

? ? ? ?默認(rèn)的同步監(jiān)視器是this

18、講下什么是死鎖,死鎖發(fā)生的幾個條件是什么

? ? ? ? 死鎖就是當(dāng)有兩個或兩個以上的線程都獲得對方的資源,但彼此都不肯放開,處于僵持階段,此時就造成了死鎖

? ? ? ? 條件:兩個或兩個以上的線程,同時想要獲得對方的資源,彼此又不肯放開

19、線程間是怎么通信的,通過調(diào)用幾個方法來交互的

? ? ? ? 線程是通過wait , notify等方法相互作用進行協(xié)作通信;

? ? ? ? wait()方法使得當(dāng)前線程必須要等待,直到到另外一個線程調(diào)用notify()或者notifyAll()方法喚醒

? ? ? ? -- wait()和notify()方法要求在調(diào)用時線程已經(jīng)獲得了對象鎖,因此對這兩個方法的調(diào)用需要放? ? ? ? ? ?在? synchronized修飾的方法或代碼塊中。

20、wait,notify,notifyAll在什么地方使用才有效,他們是那個類的方法

? ? ? ? Wait,notify,notifyAll都必須在synchronized修飾的方法或代碼塊中使用,都屬于Object的方法,可以被所有類繼承,都是final修飾的方法,不能通過子類重寫去改變他們的行為

21、wait和sleep有什么區(qū)別和聯(lián)系,他們執(zhí)行的時候是否都會釋放鎖

? ? ? ? Wait和sleep都可以使線程暫停,但wait必須在synchronized修飾的方法或代碼塊中使用,

? ? ? ?Sleep()方法是線程類的靜態(tài)方法,調(diào)用此方法會讓當(dāng)前線程暫停執(zhí)行指定的時間,將執(zhí)行機會(CPU)讓給其它線程,但是對象的鎖依然保持,因此休眠時間結(jié)束后會自動恢復(fù)(就緒狀態(tài)),

? ? ? ?wait()是Object類的方法,調(diào)用對象的wait()方法會讓當(dāng)前線程放棄對象的鎖(線程暫停執(zhí)行),進入對象的等待池(wait pool),只有調(diào)用對象的Notify()或notifyAll()方法才能喚醒等待池中的線程進入等鎖池(lock pool),如果線程重新獲得對象的鎖就可以進入就緒狀態(tài)

22、yield,sleep方法有什么區(qū)別和聯(lián)系

? ? ? ? Yield和sleep都可以讓線程暫停,

1)? ? ? Sleep()方法給其它線程運行機會時不考慮線程的優(yōu)先級,因此會給低優(yōu)先級的線程以運行機會…yield()方法只會給相同優(yōu)先級或更高優(yōu)先級的線程以運行機會

2)? ? ? 線程執(zhí)行sleep()方法后轉(zhuǎn)入阻塞狀態(tài),而執(zhí)行yield()方法后轉(zhuǎn)入就緒狀態(tài)

3)? ? ? Sleep()方法聲明拋出InterruptedException,而yield()方法沒有聲明任何異常

4)? ? ? Sleep()方法比yield()方法具有更好的可移植性

23、線程的啟動是哪個方法,調(diào)用的是哪個方法?

? ? ? ? Start用于啟動線程,當(dāng)調(diào)用start后,線程并不會馬上運行,而是處于就緒狀態(tài),是否運行取決于cpu給的時間片

? ? ? ? Run()方法用于子類重寫來實現(xiàn)線程的功能

? ? ? ? 我們一般調(diào)用的是start方法,系統(tǒng)調(diào)用的是run方法

24、線程安全與線程不安全的區(qū)別

? ? ? ? ? ? ? 線程安全就是多線程訪問時,采用了加鎖機制,

? ? ? ? ? ? ? 當(dāng)一個線程訪問類中某個數(shù)據(jù),進行保護,其它線程不能進行訪問,直到該線程執(zhí)行完,其它線程才可使用---不會導(dǎo)致數(shù)據(jù)污染

? ? ? ? ? ? ? 線程不安全就是不提供數(shù)據(jù)訪問保護,有可能出現(xiàn)多個線程先后更改數(shù)據(jù)造成所得到的數(shù)據(jù)是臟數(shù)據(jù)

25、線程的實現(xiàn)方式,線程的生命周期等

? ? ? ? ? ? ? 實現(xiàn)方式

1)? 通過繼承Thread類

2)? 實現(xiàn)Runnable接口

3)? 實現(xiàn)Callable接口

? ? ? ? ? ? ? 生命周期

? ? ? ? ? ? ? 新建

? ? ? ? ? ? ? 就緒

? ? ? ? ? ? ? 運行

? ? ? ? ? ? ? 堵塞

? ? ? ? ? ? ? 死亡

26、如何處理線程不安全問題(有2種解決方法)

? ? ? ? ? ? ? 第一,是采用原子變量,線程安全問題最根本上是由于全局變量和靜態(tài)變量引起的,定義變量用sig_atomic_t和volatile。

? ? ? ? ? ? ? 第二,就是實現(xiàn)線程間同步,讓線程有序訪問變量

27、線程中常用方法的區(qū)別

? ? ? ? ? ? ? 線程中用到最多的是start方法,它的作用是啟動一個線程

? ? ? ? ? ? ? Sleep()讓線程休眠一會,但不會釋放鎖

? ? ? ? ? ? ? Join()強制執(zhí)行一個線程

? ? ? ? ? ? ? Wait()是Object類中的方法,會讓當(dāng)前線程放棄對象鎖,進入對象等待池

? ? ? ? ? ? ? Yield()禮讓線程,讓另外一個線程執(zhí)行一會,自己再執(zhí)行,只能讓同優(yōu)先級的線程有執(zhí)行的機會

? ? ? ? ? ? ? currentThread()用于獲得當(dāng)前線程對象,可以調(diào)用getName()方法獲得當(dāng)前線程名字

28、多線程和單線程有什么區(qū)別?

? ? ? ? 干一件事情一個人干和兩個人同時干的區(qū)別

29、線程的5種狀態(tài),__、_、_、___。啟動調(diào)用_方法,啟動后會調(diào)用__方法。

? ? ? ? ? ? ? 新生

? ? ? ? ? ? ? 就緒

? ? ? ? ? ? ? 運行

? ? ? ? ? ? ? 阻塞

? ? ? ? ? ? ? 死亡

? ? ? ? ? ? ? 啟動調(diào)用start()

30、用同步塊與同步方法的區(qū)別?

? ? ? ? ? ? ? 同步方法是被synchronized修飾的方法,同步整個方法, ,同一時間只有一個線程可以訪問該? ? ? ? ? ? ? ? ? ?方法

? ? ? ? ? ? ? 同步塊是被synchronized修飾的代碼塊,可以同步一小部分代碼? ? ? ? ? ?

? ? ? ? ? ? ? 同步代碼越少性能越好,當(dāng)性能要求比較高時,用同步塊? ? ?

31、什么是同步和異步,分別用例子說明,同步有幾種方式?

? ? ? ? 同步是排隊去做事情,異步就是各做各的

32、什么是對象鎖?

1.? java中的每個對象都有一個鎖,當(dāng)訪問某個對象的synchronized方法時,表示將該對象上鎖,此時其他任何線程都無法在去訪問該syncronized 方法了,直到之前的那個線程執(zhí)行方法完畢后,其他線程才有可能去訪問該synchronized方法。

2.如果一個對象有多個synchronized方法,某一時刻某個線程已經(jīng)進入到某個synchronzed方法,那么在該方法沒有執(zhí)行完畢前,其他線程無法訪問該對象的任何synchronzied 方法的,但可以訪問非synchronzied方法。

3.如果synchronized方法是static的,那么當(dāng)線程訪問該方法時,它鎖的并不是synchronized方法所在的對象,而是synchuronized方法所在對象的對應(yīng)的Class對象,

? ? ? ? [類鎖(synchronized修飾的靜態(tài)方法)]

33、什么是死鎖?

? ? ? ?死鎖就是當(dāng)有兩個或兩個以上的線程都獲得對方的資源,但彼此有不肯放開,處于僵持狀態(tài),此時便造成了死鎖。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容