面試題:Java中sleep和wait方法的區別


摘要:介紹sleep方法和wait方法的相同點和區別。

  在JAVA多線程的學習中,不少人會把函數sleep和wait搞混,傻傻分不清,簡單粗暴地認為都是使得線程進入等待狀態,比如就分不清方法sleep(long)和wait(long)。下面主要介紹sleep方法和wait方法的相同點和區別。

  關於sleep() 和 wait()方法的異同點是什么的問題,首先需要明白的是sleep()是Thread的靜態本地方法,wait()是Object的成員方法,由此可知,二者是有本質區別的。

相同點: 一旦執行方法,都可以使得當前的線程進入等待狀態。

不同點

  1. 聲明的位置不同,sleep()聲明在Thread 類,wait()聲明在Object 類;
  2. 關於是否可以指定睡眠時間,sleep函數必須指定,wait可以指定也可以不指定;
  3. sleep() 會讓當前正在運行的、占用CPU時間片的線程掛起指定時間,休眠時間到自動蘇醒進入可運行狀態;切記,是不會由睡眠狀態直接變為運行狀態的。wait() 方法用來線程間通信,如果設置了時間,就等待指定時間;如果不設置,則該對象在其它線程被調用 notify() / notifyAll() 方法后進入可運行狀態,才有機會競爭獲取對象鎖。
  4. 適用場景不同,sleep()可以在任何需要的場景下調用,wait()必須在同步代碼塊中或者同步方法中的監視器中。
  5. 關於是否釋放同步監視器,如果兩方法都是使用在同步代碼塊或同步方法中,sleep()不會釋放鎖,wait()會釋放鎖,並進入線程等待池。
  6. sleep()線程控制自身流程。wait()用來線程間通信,使擁有該對象鎖的線程等待直到指定時間或notify()。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM