57、thread類的sleep()方法和物件的wait()方法都可以讓執行緒暫停執行,它們有什麼區別?
答:sleep()方法(休眠)是執行緒類(thread)的靜態方法,呼叫此方法會讓當前執行緒暫停執行指定的時間,將執行機會(cpu)讓給其他執行緒,但是物件的鎖依然保持,因此休眠時 間結束後會自動恢復(執行緒回到就緒狀態,請參考第66題中的執行緒狀態轉換圖)。wait()是object類的方法,呼叫物件的wait()方法導致當前執行緒放棄物件的鎖(執行緒暫停執行), 進入物件的等待池(wait pool),只有呼叫物件的notify()方法(或notifyall()方法)時才能喚醒等待池中的執行緒進入等鎖池(lock pool),如果執行緒重新獲得物件的鎖就可以 進入就緒狀態。
58、執行緒的sleep()方法和yield()方法有什麼區別?
答:① sleep()方法給其他執行緒執行機會時不考慮執行緒的優先順序,因此會給低優先順序的執行緒以執行的機會;yield()方法只會給相同優先順序或更高優先順序的執行緒以執行的機會;
② 執行緒執行sleep()方法後轉入阻塞(blocked)狀態,而執行yield()方法後轉入就緒(ready)狀態;
③ sleep()方法宣告丟擲interruptedexception,而yield()方法沒有宣告任何異常;
④ sleep()方法比yield()方法(跟作業系統cpu排程相關)具有更好的可移植性。
60、請說出與執行緒同步以及執行緒排程相關的方法。
答:- wait():使乙個執行緒處於等待(阻塞)狀態,並且釋放所持有的物件的鎖;
- sleep():使乙個正在執行的執行緒處於睡眠狀態,是乙個靜態方法,呼叫此方法要處理interruptedexception異常;
- notify():喚醒乙個處於等待狀態的執行緒,當然在呼叫此方法的時候,並不能確切的喚醒某乙個等待狀態的執行緒,而是由jvm確定喚醒哪個執行緒,而且與優先順序無關;
- notityall():喚醒所有處於等待狀態的執行緒,該方法並不是將物件的鎖給所有執行緒,而是讓它們競爭,只有獲得鎖的執行緒才能進入就緒狀態;
sleep()和yield()的區別
sleep()和yield()的區別):sleep()使當前執行緒進入停滯狀態,所以執行sleep()的執行緒在指定的時間內肯定不會被執行;yield()只是使當前執行緒重新回到可執行狀態,所 以執行yield()的執行緒有可能在進入到可執行狀態後馬上又被執行。
sleep 方法使當前執行中的執行緒睡眼一段時間,進入不可執行狀態,這段時間的長短是由程式設定的,yield 方法使當前執行緒讓出 cpu 佔有權,但讓出的時間是不可設定 的。實際上,yield()方法對應了如下操作:先檢測當前是否有相同優先順序的執行緒處於同可執行狀態,如有,則把 cpu 的佔有權交給此執行緒,否則,繼續執行原來的執行緒。所以 yield()方法稱為「退讓」,它把執行機會讓給了同等優先順序的其他執行緒
另外,sleep 方法允許較低優先順序的執行緒獲得執行機會,但 yield() 方法執行時,當前執行緒仍處在可執行狀態,所以,不可能讓出較低優先順序的執行緒些時獲得 cpu 佔有權 。在乙個執行系統中,如果較高優先順序的執行緒沒有呼叫 sleep 方法,又沒有受到 i\o 阻塞,那麼,較低優先順序執行緒只能等待所有較高優先順序的執行緒執行結束,才有機會執行。
1、執行緒同步的目的是為了保護多個執行緒反問乙個資源時對資源的破壞。
2、執行緒同步方法是通過鎖來實現,每個物件都有切僅有乙個鎖,這個鎖與乙個特定的物件關聯,執行緒一旦獲取了物件鎖,其他訪問該物件的執行緒就無法再訪問該物件的其他非同步 方法。
3、對於靜態同步方法,鎖是針對這個類的,鎖物件是該類的class物件。靜態和非靜態方法的鎖互不干預。乙個執行緒獲得鎖,當在乙個同步方法中訪問另外物件上的同步方法時,會 獲取這兩個物件鎖。
4、對於同步,要時刻清醒在哪個物件上同步,這是關鍵。
5、編寫執行緒安全的類,需要時刻注意對多個執行緒競爭訪問資源的邏輯和安全做出正確的判斷,對「原子」操作做出分析,並保證原子操作期間別的執行緒無法訪問競爭資源。
6、當多個執行緒等待乙個物件鎖時,沒有獲取到鎖的執行緒將發生阻塞。
7、死鎖是執行緒間相互等待鎖鎖造成的,在實際中發生的概率非常的小。真讓你寫個死鎖程式,不一定好使,呵呵。但是,一旦程式發生死鎖,程式將死掉。
java多執行緒面試題
有三個執行緒id分別是a b c,請有多線程式設計實現,在螢幕上迴圈列印10次abcabc 由於執行緒執行的不確定性,要保證這樣有序的輸出,必須控制好多執行緒的同步。執行緒同步有兩種基本方法 1 synchronized 2 wait,notify,notifyall 現在分別採用這兩種方法來解答這...
Java多執行緒面試題
執行緒池的原理,為什麼要建立執行緒池?將預先建立好的執行緒放入執行緒池當中。當有執行緒請求時,則從執行緒池中呼叫執行緒,呼叫結束之後歸還執行緒。當出現需要建立大量執行緒的情況時,反覆的建立執行緒會造成大量的效能損耗。使用執行緒池能降低損耗,提高響應的速度,方便管理執行緒。執行緒的生命週期,什麼時候會...
JAVA多執行緒常見面試題總結
1 多執行緒有幾種實現方案,分別是哪幾種?兩種。繼承thread類 實現runnable介面 擴充套件一種 實現callable介面。這個得和執行緒池結合。2 同步有幾種方式,分別是什麼?兩種。同步 塊 同步方法 3 啟動乙個執行緒是run 還是start 它們的區別?start run 封裝了被執...