首頁 >Java >java教程 >sleep()和wait()他們有什麼不同?

sleep()和wait()他們有什麼不同?

云罗郡主
云罗郡主轉載
2018-10-15 13:55:203364瀏覽

這篇文章帶給大家的內容是關於sleep()和wait()他們有什麼不同? ,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

sleep()和wait()有什麼差別。

sleep是線程類別(Thread)的方法,導致此線程暫停執行指定時間,並把執行機會給其他線程,但是監控狀態仍然保持,到時候會自動恢復。呼叫sleep不會釋放物件鎖定。 wait是Object類別的方法,對此物件呼叫wait方法導致本執行緒放棄物件鎖,進入等待此物件的等待鎖定池,只有針對此物件發出的notify方法或notifyAll後,本執行緒才進入物件鎖定池準備取得對象鎖進入運作狀態。

當一個執行緒進入一個物件的一個synchronized方法後,其他執行緒是否可進入此物件的其他方法。

其他執行緒只能存取該物件的其他非同步方法,同步方法則不能進入。

執行緒同步方法有哪些?

wait():使一個執行緒處於等待狀態,並且釋放所持有的物件的lock;

sleep():使一個正在運行的執行緒處於睡眠狀態,是一個靜態方法,呼叫此方法要捕捉InterruptedException異常;

notify():喚醒一個處於等待狀態的線程,注意的是在調用此方法的時候,並不能確切的喚醒某一個等待狀態的線程,而是由JVM決定喚醒哪個線程,而且不是按優先級;

notifyAll():喚醒所有處於等待狀態的線程,注意並不是給所有喚醒線程一個物件的鎖,而是讓它們競爭。

多執行緒有幾種實作方法,同步有幾種實作方法。

多執行緒有兩種實作方法,分別是繼承Thread類別與實作Runnable介面;

#同步的實作方法有兩種,分別是synchronized、wait與notify。

同步和非同步有何異同,在什麼情況下使用它們?

如果資料將在執行緒中共享。例如正在寫的數據以後可能被另一個線程讀到,或者已經讀的數據已經被另一個數據寫過了,那麼這些數據就是共享數據,必須進行同步訪問。當應用程式在應用程式上被呼叫了一個需要花費很長時間來執行的方法,並且不希望程式等待方法的返回時,就應該使用非同步編程,在許多情況下採用非同步途徑往往更有效率。

啟動一個執行緒使用run()還是start()。

啟動一個執行緒是呼叫start()方法,使執行緒代表的虛擬機器處於可運行狀態,這意味著它可以由JVM調度並執行,這並不意味著執行緒就會立即運行。 run()方法可以產生必須退出的標誌來停止一個執行緒。

執行緒的基本概念、執行緒的基本狀態、狀態之間的關係。

線程指在執行的過程中,能夠執行程式碼的一個執行單位,每個程式至少都有一個線程,也就是程式本身;

Java中的線程有四種狀態分別是:運作、就緒、掛起、結束。

簡述synchronized和java.util.concurrent.locks.Lock的異同。

主要相同點:Lock能完成synchronized所實現的所有功能;

#主要不同點:Lock有比synchronized更精確的線程語義和更好的性能。 synchronized會自動釋放鎖,而Lock一定要求程式設計師手動釋放,並且必須在finally從句中釋放。

java中有幾種方法可以實作一個執行緒?用什麼關鍵字修飾同步方法? stop()和suspend()為何不建議使用?

有兩種實作方法,分別是繼承Thread和實作Runnable介面;

用synchronized修飾同步方法;

反對使用stop()是因為它不安全。它會解除由執行緒所取得的所有鎖定,而且如果物件處於一種不連貫狀態,那麼其他執行緒能在這種狀態下檢查和修改它們。結果很難檢查出真正的問題所在。

suspend()方法容易發生死鎖。在呼叫suspend()的時候,目標執行緒會停下來,但卻仍然持有在這之前獲得的鎖定。此時,其他任何執行緒都無法存取鎖定的資源,除非被「掛起」的執行緒恢復執行。對任何線程來說,如果它們想恢復目標線程,同時又試圖使用任何一個鎖定的資源,就會造成死鎖。故不應該使用suspend(),而應在自己的Thread類別中置入一個標誌,指出線程應該活動還是掛起。若標誌指出線程應該掛起,便用wait()命其進入等待狀態。若標誌指出線程應恢復,則用一個notify()重新啟動線程。

以上就是對sleep()和wait()他們有什麼區別的全部介紹,如果您想了解更多有關Java視頻教程,請關注PHP中文網。

以上是sleep()和wait()他們有什麼不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:cnblogs.com。如有侵權,請聯絡admin@php.cn刪除