精選Java線程面試題_第1頁
精選Java線程面試題_第2頁
精選Java線程面試題_第3頁
精選Java線程面試題_第4頁
精選Java線程面試題_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、精選Java線程面試題Java是一門面向?qū)ο缶幊陶Z言,不僅吸收了 C+語言的各種優(yōu) 點,還摒棄了 C+里難以理解的多繼承、指針等概念。下面是小編 搜集的Java線程題,歡迎大家閱讀。1)什么是線程?線程是操作系統(tǒng)能夠進行運算調(diào)度的最小單位,它被包含在進 程之中,是進程中的實際運作單位。程序員可以通過它進行多處理器 編程,你可以使用多線程對運算密集型任務(wù)提速。比如,如果一個線 程完成一個任務(wù)要100毫秒,那么用十個線程完成改任務(wù)只需10毫 秒。Java在語言層面對多線程提供了卓越的支持,它也是一個很好 的賣點。欲了解更多詳細信息請點擊這里。2)線程和進程有什么區(qū)別?線程是進程的子集,一個進程可以

2、有很多線程,每條線程并行 執(zhí)行不同的任務(wù)。不同的進程使用不同的內(nèi)存空間, 而所有的線程共 享一片相同的內(nèi)存空間。別把它和棧內(nèi)存搞混,每個線程都擁有單獨 的棧內(nèi)存用來存儲本地數(shù)據(jù)。更多詳細信息請點擊這里。3) 如何在Java中實現(xiàn)線程?在語言層面有兩種方式。java。la ng。Thread類的實例就是 一個線程但是它需要調(diào)用java。la ng。Runn able接口來執(zhí)行,由于 線程類本身就是調(diào)用的 Ru nn able接口所以你可以繼承java。la ng。 Thread類或者直接調(diào)用Runnable接口來重寫run ()方法實現(xiàn)線 程。更多詳細信息請點擊這里。4 )用 Runnable

3、還是 Thread ?這個問題是上題的后續(xù),大家都知道我們可以通過繼承Thread 類或者調(diào)用Runnable接口來實現(xiàn)線程,問題是,那個方法更好呢? 什么情況下使用它?這個問題很容易回答,如果你知道Java不支持類的多重繼承,但允許你調(diào)用多個接口。所以如果你要繼承其他類, 當然是調(diào)用Runnable接口好了。更多詳細信息請點擊這里。5) Thread類中的start () 和run () 方法有什么區(qū)別?這個問題經(jīng)常被問到,但還是能從此區(qū)分出面試者對 Java線程 模型的理解程度。start ()方法被用來啟動新創(chuàng)建的線程,而且start()內(nèi)部調(diào)用了 run ()方法,這和直接調(diào)用run

4、()方法的效果不 一樣。當你調(diào)用run ()方法的時候,只會是在原來的線程中調(diào)用, 沒有新的線程啟動,start ()方法才會啟動新線程。更多討論請點 擊這里6) Java 中 Runnable 和 Callable 有什么不同?Runnable和Callable都代表那些要在不同的線程中執(zhí)行的任 務(wù)。Runnable 從 JDK1。0 開始就有了,Callable 是在 JDK1。5 增 加的。它們的主要區(qū)別是 Callable的call ()方法可以返回值和拋 出異常,而Runnable的run ()方法沒有這些功能。Callable可以 返回裝載有計算結(jié)果的Future對象。我的博客有更

5、詳細的說明。7) Java 中 CyclicBarrier 和 CountDownLatch有什么不同?CyclicBarrier 和CountDownLatch都可以用來讓一組線程等待其它線程。與 CyclicBarrier 不同的是,Cou ntdow nLatch不能重新使用。點此查看更多信息和示例代碼。8) Java 中 CyclicBarrier 和 CountDownLatch有什么不同?CyclicBarrier 和CountDownLatch都可以用來讓一組線程等待其它線程。與 CyclicBarrier 不同的是,Cou ntdow nLatch不能重新使用。9) Java內(nèi)

6、存模型是什么?Java內(nèi)存模型規(guī)定和指引Java程序在不同的內(nèi)存架構(gòu)、CPU 和操作系統(tǒng)間有確定性地行為。它在多線程的情況下尤其重要。Java 內(nèi)存模型對一個線程所做的變動能被其它線程可見提供了保證,它 們之間是先行發(fā)生了關(guān)系。這個關(guān)系定義了一些規(guī)則讓程序員在并發(fā) 編程時思路更清晰。比如,先行發(fā)生了關(guān)系確保了:線程內(nèi)的代碼能夠按先后順序執(zhí)行,這被稱為程序次序規(guī)則。對于同一個鎖,一個解鎖操作一定要發(fā)生在時間上后發(fā)生的另 一個鎖定操作之前,也叫做管程鎖定規(guī)則。前一個對volatile的寫操作在后一個volatile的讀操作之前, 也叫volatile變量規(guī)則。一個線程內(nèi)的任何操作必需在這個線程的s

7、tart ()調(diào)用之后,也叫作線程啟動規(guī)則。一個線程的所有操作都會在線程終止之前,線程終止規(guī)則。一個對象的終結(jié)操作必需在這個對象構(gòu)造完成之后,也叫對象 終結(jié)規(guī)則??蓚鬟f性10) Java中的volatile 變量是什么?volatile是一個特殊的修飾符,只有成員變量才能使用它。在 Java并發(fā)程序缺少同步類的情況下,多線程對成員變量的操作對其 它線程是透明的。volatile變量可以保證下一個讀取操作會在前一個 寫操作之后發(fā)生,就是上一題的 volatile變量規(guī)則。11) 什么是線程安全? Vector是一個線程安全類嗎?如果你的代碼所在的進程中有多個線程在同時運行,而這些線程可能會同時運

8、行這段代碼。如果每次運行結(jié)果和單線程運行的結(jié)果 是一樣的,而且其他的變量的值也和預(yù)期的是一樣的,就是線程安全的。一個線程安全的計數(shù)器類的同一個實例對象在被多個線程使用 的情況下也不會出現(xiàn)計算失誤。很顯然你可以將集合類分成兩組,線程安全和非線程安全的。Vector是用同步方法來實現(xiàn)線程安全的, 而和它相似的ArrayList不是線程安全的。12) Java中什么是競態(tài)條件?舉個例子說明。競態(tài)條件會導(dǎo)致程序在并發(fā)情況下出現(xiàn)一些bugs。多線程對一些資源的競爭的時候就會產(chǎn)生競態(tài)條件,如果首先要執(zhí)行的程序競爭失敗排到后面執(zhí)行了,那么整個程序就會出現(xiàn)一些不確定的bugs。這種bugs很難發(fā)現(xiàn)而且會重復(fù)出

9、現(xiàn),因為線程間的隨機競爭。13) Java中如何停止一個線程?Java提供了很豐富的API但沒有為停止線程提供 API。JDK 1。 0本來有一些像stop (), suspend () 和resume ()的控制方 法但是由于潛在的死鎖威脅因此在后續(xù)的JDK版本中他們被棄用了,之后Java API的設(shè)計者就沒有提供一個兼容且線程安全的方法來停 止一個線程。當run ()或者call ()方法執(zhí)行完的時候線程會自 動結(jié)束,如果要手動結(jié)束一個線程,你可以用volatile布爾變量來退出run ()方法的循環(huán)或者是取消任務(wù)來中斷線程。14) 一個線程運行時發(fā)生異常會怎樣?這是我在一次面試中遇到的一

10、個很刁鉆的Java面試題,簡單的說,如果異常沒有被捕獲該線程將會停止執(zhí)行。Thread。 Un caughtExceptio nHa ndler是用于處理未捕獲異常造成線程突然中 斷情況的一個內(nèi)嵌接口。當一個未捕獲異常將造成線程中斷的時 候 JVM 會使用 Thread。getUncaughtExceptionHandler()來查詢線程的UncaughtExceptionHandler并將線程和異常作為參數(shù)傳遞給handler的uncaughtException()方法 進行處理。15) 如何在兩個線程間共享數(shù)據(jù)?你可以通過共享對象來實現(xiàn)這個目的,或者是使用像阻塞隊列這樣并發(fā)的數(shù)據(jù)結(jié)構(gòu)。(涉

11、及到在兩個線程間共享對象)用 wait和notify方法實現(xiàn) 了生產(chǎn)者消費者模型。16) Java 中 notify 和 notifyAII 有什么區(qū)別?這又是一個刁鉆的問題,因為多線程可以等待單監(jiān)控鎖,javaAPI的設(shè)計人員提供了一些方法當?shù)却龡l件改變的時候通知它們,但是這些方法沒有完全實現(xiàn)。notify ()方法不能喚醒某個具體的線程, 所以只有一個線程在等待的時候它才有用武之地。而 n otifyAII () 喚醒所有線程并允許他們爭奪鎖確保了至少有一個線程能繼續(xù)運行。17) 為什么wait, notify 和notifyAII這些方法不在thread 類里面?這是個設(shè)計相關(guān)的問題,它

12、考察的是面試者對現(xiàn)有系統(tǒng)和一些 普遍存在但看起來不合理的事物的看法?;卮疬@些問題的時候,你要說明為什么把這些方法放在Object類里是有意義的,還有不把它放在Thread類里的原因。一個很明顯的原因是 JAVA提供的鎖是對象 級的而不是線程級的,每個對象都有鎖,通過線程獲得。如果線程需要等待某些鎖那么調(diào)用對象中的wait ()方法就有意義了。如果wait ()方法定義在Thread類中,線程正在等待的是哪個鎖就不明顯了。簡單的說,由于 wait,notify和notifyAII都是鎖級別的操 作,所以把他們定義在 Object類中因為鎖屬于對象。18) 什么是ThreadLocal變量?Thr

13、eadLocal是Java里一種特殊的變量。每個線程都有一個 ThreadLocal就是每個線程都擁有了自己獨立的一個變量,競爭條件被 徹底消除了。它是為創(chuàng)建代價高昂的對象獲取線程安全的好方法,比如你可以用ThreadLocal 讓SimpleDateFormat 變成線程安全 的,因為那個類創(chuàng)建代價高昂且每次調(diào)用都需要創(chuàng)建不同的實例所 以不值得在局部范圍使用它,如果為每個線程提供一個自己獨有的變 量拷貝,將大大提高效率。首先,通過復(fù)用減少了代價高昂的對象的創(chuàng)建個數(shù)。其次,你在沒有使用高代價的同步或者不變性的情況下 獲得了線程安全。線程局部變量的另一個不錯的例子是 ThreadLocalRan

14、dom 類,它在多線程環(huán)境中減少了創(chuàng)建代價高昂的 Random對象的個數(shù)。19) 什么是 FutureTask ?在Java并發(fā)程序中FutureT ask表示一個可以取消的異步運算。它有啟動和取消運算、查詢運算是否完成和取回運算結(jié)果等方法。只 有當運算完 成的時候結(jié)果才能取回,如果運算尚未完成 get方法將 會阻塞。一個FutureTask對象可以對調(diào)用了 Callable和Runnable 的對象進行包 裝,由于FutureTask也是調(diào)用了 Runnable接口所以 它可以提交給Executor來執(zhí)行。20) Java 中 interrupted和 isInterruptedd 方法的區(qū)

15、別?interrupted() 和isInterrupted()的主要區(qū)別是前者會將中斷狀態(tài)清除而后者不會。Java多線程的中斷機制是用內(nèi)部標識來 實現(xiàn)的,調(diào)用Thread。interrupt ()來中斷一個線程就會設(shè)置中斷 標識為true。當中斷線程調(diào)用靜態(tài)方法 Thread。interrupted()來檢查中斷狀態(tài)時,中斷狀態(tài)會被清零。而非靜態(tài)方法isI nterrupted()用來查詢其它線程的中斷狀態(tài)且不會改變中斷狀態(tài)標識。簡單的說就是任何拋 出InterruptedException異常的方法都會將中斷狀態(tài)清零。無論如何,一個線程的中斷狀態(tài)有有可能被其它線程調(diào)用中 斷來改變。21)為

16、什么wait和notify方法要在同步塊中調(diào)用?主要是因為Java API強制要求這樣做,如果你不這么做,你的 代碼會拋出IllegalMonitorStateException異常。還有一個原因是為了避免wait和notify之間產(chǎn)生競態(tài)條件。22)為什么你應(yīng)該在循環(huán)中檢查等待條件?處于等待狀態(tài)的線程可能會收到錯誤警報和偽喚醒,如果不在 循環(huán)中檢查等待條件,程序就會在沒有滿足結(jié)束條件的情況下退出。 因此,當一個等待線程醒來時,不能認為它原來的等待狀態(tài)仍然是有效的,在notify ()方法調(diào)用之后和等待線程醒來之前這段時間它 可能會改變。23)Java中的同步集合與并發(fā)集合有什么區(qū)別?同步集合

17、與并發(fā)集合都為多線程和并發(fā)提供了合適的線程安全 的集合,不過并發(fā)集合的可擴展性更高。在Java1。5之前程序員們只有同步集合來用且在 多線程并發(fā)的時候會導(dǎo)致爭用,阻礙了系統(tǒng) 的擴展性。Java5介紹了并發(fā)集合像ConcurrentHashMap,不僅提供線程安全還用鎖分離和內(nèi)部分區(qū)等現(xiàn)代技術(shù)提高了可擴展性。24)Java中堆和棧有什么不同?為什么把這個問題歸類在多線程和并發(fā)面試題里?因為棧是一 塊和線程緊密相關(guān)的內(nèi)存區(qū)域。每個線程都有自己的棧內(nèi)存,用于存 儲本地變量,方法參數(shù)和棧 調(diào)用,一個線程中存儲的變量對其它線程是不可見的。而堆是所有線程共享的一片公用內(nèi)存區(qū)域。 對象都在 堆里創(chuàng)建,為了提升效率線程會從堆中弄一個緩存到自己的棧,如果多個線程使用該變量就可能引發(fā)問題,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論