- 相關(guān)推薦
java面試題五
1. 多線(xiàn)程有幾種實(shí)現方法?同步有幾種實(shí)現方法?
多線(xiàn)程有兩種實(shí)現方法,分別是繼承Thread類(lèi)與實(shí)現Runnable接口
同步的實(shí)現方面有兩種,分別是synchronized,wait與notify
wait():使一個(gè)線(xiàn)程處于等待狀態(tài),并且釋放所持有的對象的lock。
sleep():使一個(gè)正在運行的線(xiàn)程處于睡眠狀態(tài),是一個(gè)靜態(tài)方法,調用此方法要捕捉InterruptedException異常。
notify():喚醒一個(gè)處于等待狀態(tài)的線(xiàn)程,注意的是在調用此方法的時(shí)候,并不能確切的喚醒某一個(gè)等待狀態(tài)的線(xiàn)程,而是由JVM確定喚醒哪個(gè)線(xiàn)程,而且不是按優(yōu)先級。
Allnotity():喚醒所有處入等待狀態(tài)的線(xiàn)程,注意并不是給所有喚醒線(xiàn)程一個(gè)對象的鎖,而是讓它們競爭。
2.啟動(dòng)一個(gè)線(xiàn)程是用run()還是start()? .
啟動(dòng)一個(gè)線(xiàn)程是調用start()方法,使線(xiàn)程就緒狀態(tài),以后可以被調度為運行狀態(tài),一個(gè)線(xiàn)程必須關(guān)聯(lián)一些具體的執行代碼,run()方法是該線(xiàn)程所關(guān)聯(lián)的執行代碼。
3.當一個(gè)線(xiàn)程進(jìn)入一個(gè)對象的一個(gè)synchronized方法后,其它線(xiàn)程是否可進(jìn)入此對象的其它方法?
分幾種情況:
1.其他方法前是否加了synchronized關(guān)鍵字,如果沒(méi)加,則能。
2.如果這個(gè)方法內部調用了wait,則可以進(jìn)入其他synchronized方法。
3.如果其他個(gè)方法都加了synchronized關(guān)鍵字,并且內部沒(méi)有調用wait,則不能。
4.如果其他方法是static,它用的同步鎖是當前類(lèi)的字節碼,與非靜態(tài)的方法不能同步,因為非靜態(tài)的方法用的是this。
4.線(xiàn)程的基本概念、線(xiàn)程的基本狀態(tài)以及狀態(tài)之間的關(guān)系
一個(gè)程序中可以有多條執行線(xiàn)索同時(shí)執行,一個(gè)線(xiàn)程就是程序中的一條執行線(xiàn)索,每個(gè)線(xiàn)程上都關(guān)聯(lián)有要執行的代碼,即可以有多段程序代碼同時(shí)運行,每個(gè)程序至少都有一個(gè)線(xiàn)程,即main方法執行的那個(gè)線(xiàn)程。如果只是一個(gè)cpu,它怎么能夠同時(shí)執行多段程序呢?這是從宏觀(guān)上來(lái)看的,cpu一會(huì )執行a線(xiàn)索,一會(huì )執行 b線(xiàn)索,切換時(shí)間很快,給人的感覺(jué)是a,b在同時(shí)執行,好比大家在同一個(gè)辦公室上網(wǎng),只有一條鏈接到外部網(wǎng)線(xiàn),其實(shí),這條網(wǎng)線(xiàn)一會(huì )為a傳數據,一會(huì )為b傳數據,由于切換時(shí)間很短暫,所以,大家感覺(jué)都在同時(shí)上網(wǎng)。
狀態(tài):就緒,運行,synchronize阻塞,wait和sleep掛起,結束。wait必須在synchronized內部調用。
調用線(xiàn)程的start方法后線(xiàn)程進(jìn)入就緒狀態(tài),線(xiàn)程調度系統將就緒狀態(tài)的線(xiàn)程轉為運行狀態(tài),遇到synchronized語(yǔ)句時(shí),由運行狀態(tài)轉為阻塞,當 synchronized獲得鎖后,由阻塞轉為運行,在這種情況可以調用wait方法轉為掛起狀態(tài),當線(xiàn)程關(guān)聯(lián)的代碼執行完后,線(xiàn)程變?yōu)榻Y束狀態(tài)。
5.簡(jiǎn)述synchronized和java.util.concurrent.locks.Lock的異同 ?
主要相同點(diǎn):Lock能完成synchronized所實(shí)現的所有功能
主要不同點(diǎn):Lock有比synchronized更精確的線(xiàn)程語(yǔ)義和更好的性能。synchronized會(huì )自動(dòng)釋放鎖,而Lock一定要求程序員手工釋放,并且必須在finally從句中釋放。Lock還有更強大的功能,例如,它的tryLock方法可以非阻塞方式去拿鎖。
6. 同步和異步有何異同,在什么情況下分別使用他們?舉例說(shuō)明。
如果數據將在線(xiàn)程間共享。例如正在寫(xiě)的數據以后可能被另一個(gè)線(xiàn)程讀到,或者正在讀的數據可能已經(jīng)被另一個(gè)線(xiàn)程寫(xiě)過(guò)了,那么這些數據就是共享數據,必須進(jìn)行同步存取。
當應用程序在對象上調用了一個(gè)需要花費很長(cháng)時(shí)間來(lái)執行的方法,并且不希望讓程序等待方法的返回時(shí),就應該使用異步編程,在很多情況下采用異步途徑往往更有效率。
4.請說(shuō)出你所知道的線(xiàn)程同步的方法。
wait():使一個(gè)線(xiàn)程處于等待狀態(tài),并且釋放所持有的對象的lock。
sleep():使一個(gè)正在運行的線(xiàn)程處于睡眠狀態(tài),是一個(gè)靜態(tài)方法,調用此方法要捕捉InterruptedException異常。
notify():喚醒一個(gè)處于等待狀態(tài)的線(xiàn)程,注意的是在調用此方法的時(shí)候,并不能確切的喚醒某一個(gè)等待狀態(tài)的線(xiàn)程,而是由JVM確定喚醒哪個(gè)線(xiàn)程,而且不是按優(yōu)先級。
Allnotity():喚醒所有處入等待狀態(tài)的線(xiàn)程,注意并不是給所有喚醒線(xiàn)程一個(gè)對象的鎖,而是讓它們競爭。
5.線(xiàn)程的基本概念、線(xiàn)程的基本狀態(tài)以及狀態(tài)之間的關(guān)系
線(xiàn)程指在程序執行過(guò)程中,能夠執行程序代碼的一個(gè)執行單位,每個(gè)程序至少都有一個(gè)線(xiàn)程,也就是程序本身。
Java中的線(xiàn)程有四種狀態(tài)分別是:運行、就緒、掛起、結束。
【java面試題五】相關(guān)文章:
Java實(shí)習報告09-20
c面試題08-04
java實(shí)習報告模板11-08
java自我介紹12-06
java實(shí)訓總結11-18
java實(shí)訓報告04-15
java轉正申請書(shū)07-02
java面試自我介紹05-06
Java實(shí)習報告(15篇)03-04