首先看一下,java中線程狀態轉換簡圖,因為以上的線程操作都是調度線程從某一個狀態到另外一種狀態的切換。

Sleep()方法
在java中Sleep方法主要用于讓當前處于運行態的線程變為休眠態。這樣系統在調度可運行的線程進入運行態時就不考慮此線程。同時休眠時間結束,該線程也不是直接進入運行態,而是進入可運行的隊列,等待系統的調度。
線程從運行態進入休眠態并不釋放對象鎖,因為線程休眠的時間是可以由程序定的,而進入可運行態卻是由操作系統確定的。
wait()方法
在java中wait方法,在Java中Object對象有wait方法,所以每個對象繼承擁有了wait方法。
Wait方法的作用是擁有對象a的鎖的線程釋放該鎖給別的線程。因為處于鎖定同步方法或同步代碼塊內的代碼失去鎖則無法繼續執行。調用wait()方法也會讓線程從運行態切換到不可運行態(即等待,阻塞,睡眠),所以等待其他線程調用notify()或者notifyall()方法才有可能讓該線程從不可運行態變到可運行態。
notify()方法
notify()方法和wait()方法類似,都是Object對象所擁有的方法,每個對象都默認有notify()方法。調用 specialObject.notify()方法就是當前線程釋放對象鎖,讓其他等待該線程鎖的某一個線程獲得該對象鎖,從而從阻塞態變為可運行態。等待系統調度該線程進入運行態。Notifyall()的區別則是將所有等待該對象鎖的wait線程全部退出wait狀態去競爭對象鎖。
注意:
notify()是選擇一個線程并獲得對象鎖。
Notifyall()是讓所有方法退出wait狀態,最后只會有一個對象獲得對象鎖。
pdf下載:/Files/zhenxuanpan/java多線程一.pdf