什么是線程和進(jìn)程?
答:程序的每一次執(zhí)行都是一個(gè)進(jìn)程,每個(gè)進(jìn)程中有多個(gè)線程
請(qǐng)簡(jiǎn)要描述線程與進(jìn)程的關(guān)系,區(qū)別及優(yōu)缺點(diǎn)?
答:一個(gè)進(jìn)程中有多個(gè)線程,進(jìn)程和線程的最大區(qū)別就是每一個(gè)進(jìn)程都是獨(dú)立的,進(jìn)程之間不會(huì)相互影響,但多個(gè)線程之間可能會(huì)相互影響,還有就是線程執(zhí)行開(kāi)銷(xiāo)小,不易于資源管理,進(jìn)程是和線程相反
說(shuō)說(shuō)并發(fā)與并行的區(qū)別?
答:并發(fā):多個(gè)任務(wù)在同一段時(shí)間內(nèi)一同執(zhí)行
并行:多個(gè)任務(wù)在同一時(shí)間點(diǎn)同時(shí)執(zhí)行
為什么要使用多線程呢?
答:線程可以看做是輕量級(jí)的進(jìn)程,線程是程序執(zhí)行的最小單位,而線程的調(diào)度和切換所花費(fèi)的成本要遠(yuǎn)遠(yuǎn)小于進(jìn)程。而且我們現(xiàn)在很多系統(tǒng)都是百分級(jí)和千萬(wàn)級(jí)的并發(fā)量,使用好多線程可以幫我們提高系統(tǒng)并發(fā)和性能
使用多線程可能帶來(lái)什么問(wèn)題?
答:我們使用多線程是因?yàn)樗梢詭臀覀兲岣叱绦虻膱?zhí)行效率和運(yùn)行速度,但多線程并不能一直幫我們提高程序的運(yùn)行速度,而且使用多線程會(huì)出現(xiàn)很多問(wèn)題,比如:死鎖,內(nèi)存泄漏,上下文切換等
說(shuō)說(shuō)線程的生命周期和狀態(tài)?
新生狀態(tài)---就緒狀態(tài)---運(yùn)行狀態(tài)---阻塞狀態(tài)---等待狀態(tài)---等待超時(shí)狀態(tài)----終止?fàn)顟B(tài)
當(dāng)線程創(chuàng)建的時(shí)候,是處在新生狀態(tài),調(diào)用start()方法后,線程處于可運(yùn)行狀態(tài),當(dāng)可運(yùn)行狀態(tài)的線程獲得到CPU時(shí)間片時(shí),就處于運(yùn)行狀態(tài)。當(dāng)線程調(diào)用wait()方法時(shí),線程就會(huì)進(jìn)入到等待狀態(tài),等待狀態(tài)的線程需要依靠其他線程的通知才能回到運(yùn)行狀態(tài),而超時(shí)等待狀態(tài)就是在等待狀態(tài)的前提下添加了超時(shí)時(shí)間,當(dāng)超時(shí)時(shí)間到了之后,線程就會(huì)進(jìn)入到運(yùn)行狀態(tài)。當(dāng)線程調(diào)用同步方法時(shí),沒(méi)有獲得到鎖的時(shí)候,就會(huì)進(jìn)入到阻塞狀態(tài),當(dāng)線程調(diào)用Runnable的run()方法時(shí),線程會(huì)進(jìn)入到終止?fàn)顟B(tài)。
什么是上下文切換?
一個(gè)任務(wù)在執(zhí)行一個(gè)CPU時(shí)間片之后就會(huì)切換成另一個(gè)任務(wù),,而之前的任務(wù)狀態(tài)會(huì)保存起來(lái),等下一次輪到運(yùn)行時(shí),就再重新加載任務(wù)的狀態(tài)。而任務(wù)保存狀態(tài)到重新加載的過(guò)程就是一次上下文切換
什么是線程死鎖?如何避免死鎖?
當(dāng)兩個(gè)或多個(gè)線程同時(shí)占用對(duì)方所需要的資源,導(dǎo)致線程一直處在等待狀態(tài),就是線程死鎖
需要滿足四個(gè)條件才會(huì)出現(xiàn)線程死鎖:
①互斥條件:一個(gè)資源只能讓一個(gè)線程占有②請(qǐng)求和保持條件:一個(gè)線程因請(qǐng)求資源而阻塞時(shí),他之前所占有的資源不放③不剝奪條件:一個(gè)線程不能剝奪另一個(gè)線程所占有的資源,只能等那個(gè)線程執(zhí)行完之后,將資源釋放④等待循環(huán)條件:當(dāng)發(fā)生死鎖時(shí),每一個(gè)線程都會(huì)進(jìn)入到一個(gè)死循環(huán)的狀態(tài)
我們可以通過(guò)破壞四個(gè)條件中的一個(gè)來(lái)避免死鎖
說(shuō)說(shuō) sleep() 方法和 wait() 方法區(qū)別和共同點(diǎn)?
sleep()方法和wait()方法都是讓線程暫停執(zhí)行。他們兩個(gè)方法最大的區(qū)別就是wait()方法會(huì)釋放鎖而sleep()方法不會(huì)釋放鎖。當(dāng)wait()方法執(zhí)行之后,需要其他線程調(diào)用統(tǒng)一對(duì)象上的notify()或者notifyAll()方法才會(huì)蘇醒,而sleep()方法執(zhí)行完成之后線程會(huì)自動(dòng)蘇醒,wait(long time)超時(shí)時(shí)間到了之后也會(huì)自動(dòng)蘇醒
為什么我們調(diào)用 start() 方法時(shí)會(huì)執(zhí)行 run() 方法,為什么我們不能直接調(diào)用 run() 方法?
當(dāng)我們創(chuàng)建線程的時(shí)候,線程是處于新生狀態(tài),調(diào)用start()方法后就處于就緒狀態(tài),等待CPU分配時(shí)間片之后就會(huì)進(jìn)入到運(yùn)行狀態(tài),而start()方法就是會(huì)幫我們做好準(zhǔn)備工作,然后自動(dòng)調(diào)用run()方法的內(nèi)容,這就是多線程工作。如果我們調(diào)用run()方法的話,會(huì)把run()方法當(dāng)成main線程下的一個(gè)普通方法,不會(huì)在某個(gè)線程中去執(zhí)行他,這就不是多線程工作。