摘要:介紹sleep方法和wait方法的相同點和區別。
在JAVA多線程的學習中,不少人會把函數sleep和wait搞混,傻傻分不清,簡單粗暴地認為都是使得線程進入等待狀態,比如就分不清方法sleep(long)和wait(long)。下面主要介紹sleep方法和wait方法的相同點和區別。
關於sleep() 和 wait()方法的異同點是什么的問題,首先需要明白的是sleep()是Thread的靜態本地方法,wait()是Object的成員方法,由此可知,二者是有本質區別的。
相同點: 一旦執行方法,都可以使得當前的線程進入等待狀態。
不同點:
- 聲明的位置不同,sleep()聲明在Thread 類,wait()聲明在Object 類;
- 關於是否可以指定睡眠時間,sleep函數必須指定,wait可以指定也可以不指定;
- sleep() 會讓當前正在運行的、占用CPU時間片的線程掛起指定時間,休眠時間到自動蘇醒進入可運行狀態;切記,是不會由睡眠狀態直接變為運行狀態的。wait() 方法用來線程間通信,如果設置了時間,就等待指定時間;如果不設置,則該對象在其它線程被調用 notify() / notifyAll() 方法后進入可運行狀態,才有機會競爭獲取對象鎖。
- 適用場景不同,sleep()可以在任何需要的場景下調用,wait()必須在同步代碼塊中或者同步方法中的監視器中。
- 關於是否釋放同步監視器,如果兩方法都是使用在同步代碼塊或同步方法中,sleep()不會釋放鎖,wait()會釋放鎖,並進入線程等待池。
- sleep()線程控制自身流程。wait()用來線程間通信,使擁有該對象鎖的線程等待直到指定時間或notify()。