Java中sleep()和wait()的區別知多少?

程序員小迷 2024-04-20 16:46:49

一.所屬類:

1.sleep方法是Thread類的一個靜態方法,可以在任何線程中使用。

2.wait方法是Object類的一個實例方法,只能在同步代碼塊或同步方法中使用。

二.超時

1.sleep和wait都可以設置超時時長。

2.sleep必須指定時間參數,wait可指定也可不指定時間參數。

三.抛出異常

1.sleep可能會抛出InterruptedException(這通常發生在其他線程中斷正在sleep的線程時,中斷時會清空當前線程的中斷狀態)和IllegalArgumentException (當設置的睡眠時間爲負時)。

2.wait可能會抛出InterruptedException、IllegalArgumentException(當設置的超時時間爲負時)和IllegalMonitorStateException(未在同步代碼塊或同步方法中調用。因爲wait需要配合 synchronized 關鍵字確保線程持有對象鎖,才能正確釋放鎖並進入等待狀態。)

四.釋放CPU和鎖:

1.當線程調用sleep方法時,不會占用CPU,也不會釋放任何鎖。這意味著如果線程持有某個對象的鎖並調用sleep,其他線程仍然無法訪問該對象,直到sleep結束。

2.當線程調用wait方法時,釋放了CPU,也釋放了它當前持有的對象的鎖,並進入等待隊列。這使得其他線程可以訪問該對象,直到wait結束。

五.喚醒機制:

1.sleep方法會在指定的睡眠時間後自動喚醒線程。

2.wait方法需要其他線程調用notify或notifyAll方法來喚醒等待的線程,這時此線程進入鎖池,再次獲取對象鎖後會進入運行狀態。

六.用途:

1.sleep方法通常用于讓線程暫停一段時間,而不關心其他線程的狀態或活動。

2.wait方法通常用于線程間的通信、同步和協調。

七.引申

1.sleep方法的2種寫法。

1)Thread.sleep(timeout)

參數只能是毫秒,若參數爲負值,會抛出異常。

2)TimeUnit.SECONDS.sleep(timeout)

當參數爲負值時,會跳過執行,不會抛出異常。可以指定小時、分鍾、秒、毫秒、微秒等枚舉(此例中使用的是秒)進行調用。

2.一個線程在調用notify或notifyAll方法時,需要先獲取對象鎖,執行完畢後釋放鎖,以便其他等待鎖的線程獲得執行。

3.notify、notifyAll方法與wait方法一樣只能在同步代碼塊或同步方法中使用。

微風不燥,陽光正好,你就像風一樣經過這裏,願你停留的片刻溫暖舒心。我是程序員小迷(致力于C、C++、Java、Kotlin、Android、Shell、JavaScript、TypeScript、Python等編程技術的技巧經驗分享),若作品對您有幫助,請關注、分享、點贊、收藏、在看、喜歡,您的支持是我們爲您提供幫助的最大動力。

歡迎關注。助您在編程路上越走越好!

0 阅读:47

程序員小迷

簡介:致力于Android、C等編程技術的技巧經驗分享