久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

并發(fā)編程最基礎(chǔ)的12個(gè)面試連環(huán)炮,,你答得上幾個(gè),?

 田維常 2021-03-30

關(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)是什么,?

理解不了,,就請你把下面的背下來:

  • 對于繼承Thread方式,它的優(yōu)點(diǎn)是簡單易操作,;但是,,它的缺點(diǎn)卻很致命,,因?yàn)閖ava中只支持單繼承,如果使用這種方式,,就無法再繼承其他類了,,大家可以想象一下,這種方式是多么的死板不靈活,,所以不推薦使用,。
  • 對于實(shí)現(xiàn)Runnable接口方式,它剛好解決了繼承Thread方式的缺點(diǎn),,能夠規(guī)避java中單繼承的問題,,可以實(shí)現(xiàn)多個(gè)接口。但它也有個(gè)缺點(diǎn),,就是無法拿到線程的返回值,,其實(shí)這個(gè)缺點(diǎn)也還是可以容忍的,畢竟不是任何時(shí)候都需要返回值的,。
  • 對于實(shí)現(xiàn)Callable接口方式,,它完美解決了前面兩種方式的不足,但是它也有缺點(diǎn),,就是編碼復(fù)雜,,這樣就增大了我們程序員的使用難度。

回答了這些,,面試官一般會(huì)認(rèn)定你已經(jīng)入門多線程了,,但是他還會(huì)繼續(xù)深挖,看你到底知道多少,,通常,,他會(huì)繼續(xù)追問:線程有哪些狀態(tài),?

3,、線程有哪些狀態(tài)?

關(guān)于這道題的答案,,網(wǎng)上也存在分歧,,這里我建議大家去java.lang.Thread類里看看,Thread類中有個(gè)內(nèi)部類:State,。這個(gè)內(nèi)部類就是線程的狀態(tài),。

從這個(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è)問題也不難,你可以這么回答:

終止線程常見三種方式:

  • 調(diào)用stop方法,,使用stop方法強(qiáng)行終止,,但是這種方式一般不推薦使用。就像沒有人會(huì)推薦你,,使用強(qiáng)行關(guān)機(jī)的方式關(guān)閉正在運(yùn)行的電腦一樣,使用stop方法強(qiáng)行終止線程,,也許會(huì)發(fā)生不可預(yù)料的結(jié)果,,所以還是少用為好;
  • 使用interrupt方法中斷線程,;
  • 使用退出標(biāo)志,,使線程正常退出。也就是,,當(dāng)run方法完成后線程正常結(jié)束,。

答出這三種方式,面試官會(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)的,,也是面試頻率相對較高的題目。

比如:線程中的yield()方法有什么作用,?

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)贊,在看,,謝啦,!

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多