首先看一下,java中線程狀態(tài)轉(zhuǎn)換簡(jiǎn)圖,因?yàn)橐陨系木€程操作都是調(diào)度線程從某一個(gè)狀態(tài)到另外一種狀態(tài)的切換。

Sleep()方法
在java中Sleep方法主要用于讓當(dāng)前處于運(yùn)行態(tài)的線程變?yōu)樾菝邞B(tài)。這樣系統(tǒng)在調(diào)度可運(yùn)行的線程進(jìn)入運(yùn)行態(tài)時(shí)就不考慮此線程。同時(shí)休眠時(shí)間結(jié)束,該線程也不是直接進(jìn)入運(yùn)行態(tài),而是進(jìn)入可運(yùn)行的隊(duì)列,等待系統(tǒng)的調(diào)度。
線程從運(yùn)行態(tài)進(jìn)入休眠態(tài)并不釋放對(duì)象鎖,因?yàn)榫€程休眠的時(shí)間是可以由程序定的,而進(jìn)入可運(yùn)行態(tài)卻是由操作系統(tǒng)確定的。
wait()方法
在java中wait方法,在Java中Object對(duì)象有wait方法,所以每個(gè)對(duì)象繼承擁有了wait方法。
Wait方法的作用是擁有對(duì)象a的鎖的線程釋放該鎖給別的線程。因?yàn)樘幱阪i定同步方法或同步代碼塊內(nèi)的代碼失去鎖則無法繼續(xù)執(zhí)行。調(diào)用wait()方法也會(huì)讓線程從運(yùn)行態(tài)切換到不可運(yùn)行態(tài)(即等待,阻塞,睡眠),所以等待其他線程調(diào)用notify()或者notifyall()方法才有可能讓該線程從不可運(yùn)行態(tài)變到可運(yùn)行態(tài)。
notify()方法
notify()方法和wait()方法類似,都是Object對(duì)象所擁有的方法,每個(gè)對(duì)象都默認(rèn)有notify()方法。調(diào)用 specialObject.notify()方法就是當(dāng)前線程釋放對(duì)象鎖,讓其他等待該線程鎖的某一個(gè)線程獲得該對(duì)象鎖,從而從阻塞態(tài)變?yōu)榭蛇\(yùn)行態(tài)。等待系統(tǒng)調(diào)度該線程進(jìn)入運(yùn)行態(tài)。Notifyall()的區(qū)別則是將所有等待該對(duì)象鎖的wait線程全部退出wait狀態(tài)去競(jìng)爭(zhēng)對(duì)象鎖。
注意:
notify()是選擇一個(gè)線程并獲得對(duì)象鎖。
Notifyall()是讓所有方法退出wait狀態(tài),最后只會(huì)有一個(gè)對(duì)象獲得對(duì)象鎖。
pdf下載:/Files/zhenxuanpan/java多線程一.pdf