關(guān)注“Java后端技術(shù)全棧” 回復(fù)“000”獲取大量電子書 在面試中,關(guān)于并發(fā)編程基礎(chǔ)部分,,如果你能接住以下12個(gè)連環(huán)炮,,至少你的并發(fā)編程基礎(chǔ)還是不錯(cuò)的。 本文盡量站在面試官的角度來組織連環(huán)炮,,目錄如下: 1、創(chuàng)建線程有幾種方式,? 2,、三種方式的優(yōu)缺點(diǎn)是什么? 3,、線程有哪些狀態(tài),? 4、線程的生命周期是怎樣的? 5,、如何啟動(dòng)一個(gè)線程,? 6、start方法和run方法有什么區(qū)別,? 7,、如何終止一個(gè)正在運(yùn)行的線程呢? 8,、什么叫做線程安全,? 9、線程和進(jìn)程有什么區(qū)別,? 10,、線程之間是怎么通信的? 11,、線程中的yield()方法有什么作用,? 12、yield()方法與sleep()方法的區(qū)別,? ........繼續(xù)更新中 1,、創(chuàng)建線程有幾種方式?大家如果去網(wǎng)上搜,,會(huì)發(fā)現(xiàn)很多種方式,,七七八八的都有十來種了,但如果面試中遇到這個(gè)題目,,回答下面三種就行了: 第一種,,是繼承Thread方式; 第二種,,是實(shí)現(xiàn)Runnable接口方式,; 第三種,是實(shí)現(xiàn)Callable接口方式,。 還有就是網(wǎng)上很多文章都會(huì)提到線程池的方式,,還有網(wǎng)上也有說法是創(chuàng)建線程池只有一種方式,但是我們這里回答上面三種即可,。 這會(huì)面試官肯定會(huì)繼續(xù)問三種的區(qū)別,。 2、三種方式的優(yōu)缺點(diǎn)是什么,?理解不了,,就請你把下面的背下來:
回答了這些,,面試官一般會(huì)認(rèn)定你已經(jīng)入門多線程了,,但是他還會(huì)繼續(xù)深挖,看你到底知道多少,,通常,,他會(huì)繼續(xù)追問:線程有哪些狀態(tài),? 3,、線程有哪些狀態(tài)?關(guān)于這道題的答案,,網(wǎng)上也存在分歧,,這里我建議大家去 從這個(gè)內(nèi)部類中我們可以看到線程一共有六種狀態(tài): 第1種,(NEW)狀初始態(tài),。 第2種,,(RUNNABLE)運(yùn)行狀態(tài)。 第3種,,(BLOCKED)阻塞狀態(tài)。 第4種,(WAITING)等待狀態(tài),。 第5種,,(TIMED_WAITING)超時(shí)等待狀態(tài)。 第6種,,(TERMINATED)終止?fàn)顟B(tài),。 回答完上面幾種狀態(tài)后,面試官肯定會(huì)問:這些狀態(tài)是怎么扭轉(zhuǎn)的,,或者線程的生命周期是怎樣的? 4,、線程的生命周期是怎樣的,?這個(gè)問題是有點(diǎn)其實(shí)也很好回答,請看老田怎么給大家準(zhǔn)備的,。 1.new Thread表示NEW狀態(tài),。 2.調(diào)用start方法來到運(yùn)行(RUNNABLE)狀態(tài)。 3.等待synchronized方法或模塊的時(shí)候到(BLOCKED)阻塞狀態(tài),。獲取鎖后又來到(RUNNABLE)狀態(tài),。 4.調(diào)用Object的wait方法、Thread的join方法,、LockSupport的park方法來到(WAITING)等待狀態(tài),。反之,調(diào)用Object的notify方法,、Object的notifyAll方法,、LockSupport的unpark ( Thread )方法狀態(tài)又回到(RUNNABLE)狀態(tài)。 5.調(diào)用Thread的sleep(long)方法,、Object的wait(long)方法,、Thread的join(long)方法、LockSupport的parkNnos()方法,、LockSupport的parkUnit方法來到(TIMED_WAITING)超時(shí)等待狀態(tài),。反之,調(diào)用Object的notify方法,、Object的notifyAll方法,、LockSupport的unpark ( Thread )方法狀態(tài)又回到(RUNNABLE)狀態(tài)。 6.線程執(zhí)行完成后來到(TERMINATED)終止?fàn)顟B(tài),。 注意:面試官可能會(huì)問你,(RUNNABLE)狀態(tài)就一定執(zhí)行嗎,?不一定哈,,有兩種情況:一種就是等待就緒狀態(tài),另外一種就是運(yùn)行中,。只是這里我們把運(yùn)行中RUNNING和繼續(xù)狀態(tài)READY歸納為RUNNABLE狀態(tài)了,。 面試官這會(huì)覺得,小伙子還可以嘛,,然后可能會(huì)接著問:如何啟動(dòng)一個(gè)線程,? 5、如何啟動(dòng)一個(gè)線程,?這個(gè)問題就很簡單了,,筆試中遇到的概率那是相當(dāng)?shù)拇螅埩粢夤?/p> 啟動(dòng)方式很簡單,,就是調(diào)用線程的start方法,,即可啟動(dòng)一個(gè)線程。 這個(gè)面試題中,,很多人最容易搞混的就是start方法和run方法,,面試官很有可能會(huì)問:start方法和run方法有什么區(qū)別,? 6,、start方法和run方法有什么區(qū)別?這個(gè)面試題也是相當(dāng)?shù)暮唵喂?/p> 啟動(dòng)線程是調(diào)用線程的start方法,,不是run方法,。 如果我們直接調(diào)用run方法就和我們調(diào)用一個(gè)普通實(shí)例對象的方法一樣,不是創(chuàng)建一個(gè)線程,,僅僅就是一次普通實(shí)例對象的方法調(diào)用,,程序中依然只有主線程這一個(gè)線程,其程序執(zhí)行路徑還是只有一條,,這樣就沒有達(dá)到啟動(dòng)線程的目的,。 前面,我們說到啟動(dòng)一個(gè)線程的方法,,面試官肯定會(huì)想到:如何終止一個(gè)正在運(yùn)行的線程呢,? 7、如何終止一個(gè)正在運(yùn)行的線程呢,?既然有啟動(dòng)線程,我們不管是為了應(yīng)對面試,,還是學(xué)技術(shù)。都得有始有終嘛,,所以肯定會(huì)聯(lián)想到是否有關(guān)閉線程或者終止線程,。這個(gè)問題也不難,你可以這么回答: 終止線程常見三種方式:
答出這三種方式,面試官會(huì)覺得你對多線程還是有一定的了解的,,接下來,,他或許會(huì)問你:什么叫做線程安全? 8,、什么叫做線程安全?”安全重于一切“,,在程序界,也有這么一條不成文的規(guī)則,。java中的各種技術(shù),,都會(huì)涉及到安全相關(guān)的內(nèi)容,多線程也是如此,。 首先,,你得說說線程安全的定義,,線程安全的定義是基于一種場景假設(shè)來的,假設(shè)你的代碼在多線程下執(zhí)行和在單線程下執(zhí)行,,永遠(yuǎn)都能獲得一樣的結(jié)果,,那么你的代碼就是線程安全的。 簡單否,?覺得不簡單,,希望你多讀幾遍,,多體會(huì)體會(huì)。 扯了半天,,面試官肯定會(huì)繼續(xù)問的,,或者筆試中很容易遇到的,也是一個(gè)老掉牙的問題:線程和進(jìn)程有什么區(qū)別,? 9,、線程和進(jìn)程有什么區(qū)別?這道題呢,,說容易也容易,,說困難也困難。畢竟,,每個(gè)程序員都會(huì)接觸進(jìn)程和線程,,面試的時(shí)候,肯定也是能說出點(diǎn)什么來的,。 但同時(shí)呢,,這道題目又可以無限擴(kuò)展和深入,想答好也是不容易的,,大家可以從多個(gè)方面來切入,,多回答幾個(gè)方面的區(qū)別。 建議使用下面這種方式回答: 第一,,從概念上來說,,進(jìn)程是一個(gè)“執(zhí)行中的程序”,是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位,;線程是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位,,它被包含在進(jìn)程之中,是進(jìn)程中的實(shí)際運(yùn)作單位,。 第二,,從CPU層面來說,進(jìn)程和線程其實(shí)都是CPU工作時(shí)間段的描述,,只不過是顆粒大小不同,。 第三,從地址空間來說,,同一進(jìn)程的線程共享本進(jìn)程的地址空間,,而進(jìn)程之間則是獨(dú)立的地址空間; 前面聊了半天都是基于單線程的,,單線程的咱們都不怕,,怕的就是多線程。面試官這時(shí)候很有可能會(huì)想到:線程之間是怎么通信的,? 10,、線程之間是怎么通信的?在生活中,,你的一個(gè)網(wǎng)友,,如果有微信,那可以使用微信聊天,,沒有微信的情況下有郵箱,,那就使用郵箱聯(lián)系。那線程之間是怎么聯(lián)系的,? 可以回答下面兩種: 第一種方式,,就是內(nèi)存共享, 在共享內(nèi)存的并發(fā)模型里,,線程之間共享程序的公共狀態(tài),線程之間通過讀-寫內(nèi)存中的公共狀態(tài)來隱式的進(jìn)行通信,。 第二種方式,,就是消息傳遞。顧名思義,,就是通過明確的發(fā)送消息來顯式的進(jìn)行通信,。這里又經(jīng)常會(huì)涉及到等待喚醒機(jī)制:wait() 和 notify() 等相關(guān)問題了。 問完這些問題后,,面試官可能會(huì)挑幾個(gè)線程相關(guān)的,,也是面試頻率相對較高的題目。 11、線程中的yield()方法有什么作用,?從字面意義上來說,,我們可以猜到y(tǒng)ield()方法應(yīng)該是和讓步有關(guān)的。 在多線程里,,yield()方法,,是線程讓步的意思。當(dāng)一個(gè)線程使用了這個(gè)方法之后,,它就會(huì)把自己CPU執(zhí)行的時(shí)間讓掉,,讓自己或者其它的線程運(yùn)行。這里需要注意了,,使用yield()方法,,是讓自己或者其他線程運(yùn)行,而并不是單純的讓給其他線程,。也就是說,,調(diào)用yield()方法后,,該線程會(huì)讓出CPU資源,但也有可能馬上又是該線程獲取了CPU執(zhí)行權(quán),。 當(dāng)你回答完后,,面試官可能立馬又會(huì)問:yield()方法與sleep()方法的區(qū)別,? 12,、yield()方法與sleep()方法的區(qū)別?對于這道題,,可以從四個(gè)點(diǎn)來回答: 第一,,從線程優(yōu)先級來說,yield()方法只會(huì)給相同優(yōu)先級或者更高優(yōu)先級的線程運(yùn)行機(jī)會(huì),;但是,,sleep()方法給其他線程運(yùn)行機(jī)會(huì)時(shí)不考慮線程的優(yōu)先級,因此也會(huì)給優(yōu)先級低的線程運(yùn)行的機(jī)會(huì),。 第二,,從運(yùn)行后狀態(tài)來說,運(yùn)行yield()方法之后,,當(dāng)前線程會(huì)重新回到可執(zhí)行狀態(tài),,所以執(zhí)行yield()方法后,那個(gè)線程有可能又馬上被執(zhí)行,;但是,,如果執(zhí)行sleep()方法后,線程會(huì)轉(zhuǎn)入阻塞狀態(tài),,所以,,執(zhí)行sleep()方法的線程在指定的時(shí)間內(nèi)肯定是不會(huì)被執(zhí)行的。 第三,,從拋出異常來說,,yield()方法沒有聲明任何異常;而sleep()方法聲明拋出InterruptedException,。 第四,,從可移植性上來說,sleep()方法比yield()方法具有更好的可移植性,。 總結(jié)以上12連環(huán)炮,你能接住幾個(gè),?如果全部接住,,那恭喜你,你的并發(fā)編程基礎(chǔ)掌握的還算可以。 關(guān)于相關(guān)連環(huán)炮正在更新中...... 下面是我的知識星球,,星球內(nèi)容如下圖,,歡迎大家加入! 碼字不易,,望朋友們幫忙轉(zhuǎn)發(fā),、點(diǎn)贊,在看,,謝啦,! |
|