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