常見(jiàn)Java多線程面試題總結(jié)

常見(jiàn)Java多線程面試題總結(jié)

北大青鳥(niǎo)長(zhǎng)沙麓谷校區(qū)      2022-04-15 05:00:01     6

常見(jiàn)Java多線程面試題總結(jié),  進(jìn)程和線程之間有什么不同?  一個(gè)進(jìn)程是一個(gè)獨(dú)立(selfcontained)的運(yùn)行環(huán)境,它可以被看作一個(gè)程序或者一個(gè)應(yīng)用。而線程

課程價(jià)格 請(qǐng)咨詢

上課時(shí)段: 授課校區(qū):

詳細(xì)介紹


  進(jìn)程和線程之間有什么不同?


  一個(gè)進(jìn)程是一個(gè)獨(dú)立(selfcontained)的運(yùn)行環(huán)境,它可以被看作一個(gè)程序或者一個(gè)應(yīng)用。而線程是在進(jìn)程中執(zhí)行的一個(gè)任務(wù)。Java運(yùn)行環(huán)境是一個(gè)包含了不同的類和程序的單一進(jìn)程。線程可以被稱為輕量級(jí)進(jìn)程。線程需要較少的資源來(lái)創(chuàng)建和駐留在進(jìn)程中,并且可以共享進(jìn)程中的資源。


  多線程編程的好處是什么?


  在多線程程序中,多個(gè)線程被并發(fā)的執(zhí)行以提高程序的效率,CPU不會(huì)因?yàn)槟硞€(gè)線程需要等待資源而進(jìn)入空閑狀態(tài)。多個(gè)線程共享堆內(nèi)存(heapmemory),因此創(chuàng)建多個(gè)線程去執(zhí)行一些任務(wù)會(huì)比創(chuàng)建多個(gè)進(jìn)程更好。舉個(gè)例子,Servlets比CGI更好,是因?yàn)镾ervlets支持多線程而CGI不支持。


  用戶線程和守護(hù)線程有什么區(qū)別?


  當(dāng)我們?cè)贘ava程序中創(chuàng)建一個(gè)線程,它就被稱為用戶線程。一個(gè)守護(hù)線程是在后臺(tái)執(zhí)行并且不會(huì)阻止JVM終止的線程。當(dāng)沒(méi)有用戶線程在運(yùn)行的時(shí)候,JVM關(guān)閉程序并且退出。一個(gè)守護(hù)線程創(chuàng)建的子線程依然是守護(hù)線程。


  我們?nèi)绾蝿?chuàng)建一個(gè)線程?


  有兩種創(chuàng)建線程的方法:一是實(shí)現(xiàn)Runnable接口,然后將它傳遞給Thread的構(gòu)造函數(shù),創(chuàng)建一個(gè)Thread對(duì)象;二是直接繼承Thread類。


  有哪些不同的線程生命周期?


  當(dāng)我們?cè)贘ava程序中新建一個(gè)線程時(shí),它的狀態(tài)是New。當(dāng)我們調(diào)用線程的start()方法時(shí),狀態(tài)被改變?yōu)镽unnable。線程調(diào)度器會(huì)為Runnable線程池中的線程分配CPU時(shí)間并且講它們的狀態(tài)改變?yōu)镽unning。其他的線程狀態(tài)還有Waiting,Blocked和Dead。讀這篇文章可以了解更多關(guān)于線程生命周期的知識(shí)。


  可以直接調(diào)用Thread類的run()方法么?


  當(dāng)然可以,但是如果我們調(diào)用了Thread的run()方法,它的行為就會(huì)和普通的方法一樣,為了在新的線程中執(zhí)行我們的代碼,必須使用Thread.start()方法。


  如何讓正在運(yùn)行的線程暫停一段時(shí)間?


  我們可以使用Thread類的Sleep()方法讓線程暫停一段時(shí)間。需要注意的是,這并不會(huì)讓線程終止,一旦從休眠中喚醒線程,線程的狀態(tài)將會(huì)被改變?yōu)镽unnable,并且根據(jù)線程調(diào)度,它將得到執(zhí)行。


  你對(duì)線程優(yōu)先級(jí)的理解是什么?


  每一個(gè)線程都是有優(yōu)先級(jí)的,一般來(lái)說(shuō),高優(yōu)先級(jí)的線程在運(yùn)行時(shí)會(huì)具有優(yōu)先權(quán),但這依賴于線程調(diào)度的實(shí)現(xiàn),這個(gè)實(shí)現(xiàn)是和操作系統(tǒng)相關(guān)的(OSdependent)。我們可以定義線程的優(yōu)先級(jí),但是這并不能保證高優(yōu)先級(jí)的線程會(huì)在低優(yōu)先級(jí)的線程前執(zhí)行。線程優(yōu)先級(jí)是一個(gè)int變量(從1-10),1代表最低優(yōu)先級(jí),10代表最高優(yōu)先級(jí)。


  什么是線程調(diào)度器和時(shí)間分片?


  線程調(diào)度器是一個(gè)操作系統(tǒng)服務(wù),它負(fù)責(zé)為Runnable狀態(tài)的線程分配CPU時(shí)間。一旦我們創(chuàng)建一個(gè)線程并啟動(dòng)它,它的執(zhí)行便依賴于線程調(diào)度器的實(shí)現(xiàn)。時(shí)間分片是指將可用的CPU時(shí)間分配給可用的Runnable線程的過(guò)程。分配CPU時(shí)間可以基于線程優(yōu)先級(jí)或者線程等待的時(shí)間。線程調(diào)度并不受到Java虛擬機(jī)控制,所以由應(yīng)用程序來(lái)控制它是更好的選擇(也就是說(shuō)不要讓你的程序依賴于線程的優(yōu)先級(jí))。


  在多線程中,什么是上下文切換?


  上下文切換是存儲(chǔ)和恢復(fù)CPU狀態(tài)的過(guò)程,它使得線程執(zhí)行能夠從中斷點(diǎn)恢復(fù)執(zhí)行。上下文切換是多任務(wù)操作系統(tǒng)和多線程環(huán)境的基本特征。


  關(guān)注“北大青鳥(niǎo)長(zhǎng)沙麓谷校區(qū)IT培訓(xùn)官網(wǎng)”資訊內(nèi)容,獲取更多最新Java編程技術(shù)及面試題總結(jié)。


  


培訓(xùn)啦提醒您:交易時(shí)請(qǐng)核實(shí)對(duì)方資質(zhì),對(duì)于過(guò)大宣傳或承諾需謹(jǐn)慎!任何要求預(yù)付定金、匯款等方式均存在風(fēng)險(xiǎn),謹(jǐn)防上當(dāng)。