多线程基础-常用线程方法(三)
1.notify和wait方法
為什么notify,wait方法在Object中?
Monitor內置于每一個Object對象中,是一個同步工具,相當于操作系統中的互斥量,即值為1 的信號量。也可以稱作是對象的同步鎖。
notify(), wait()依賴于“同步鎖”,并且每個對象有且僅有一個!這就是為什么notify(), wait()等函數定義在Object類,而不是Thread類中的原因。
Object類中關于等待/喚醒的API詳細信息:
- notify() – 喚醒在此對象監視器上等待的單個線程。
- notifyAll() – 喚醒在此對象監視器上等待的所有線程。
- wait() – 讓當前線程處于“等待(阻塞)狀態”,“直到其他線程調用此對象的 notify() 方法或 notifyAll() 方法”,當前線程被喚醒(進入“就緒狀態”)。
- wait(long timeout) – 讓當前線程處于“等待(阻塞)狀態”,“直到其他線程調用此對象的 notify() 方法或 notifyAll() 方法,或者超過指定的時間量”,當前線程被喚醒(進入“就緒狀態”)。
wait(long timeout, int nanos) – 讓當前線程處于“等待(阻塞)狀態”,“直到其他線程調用此對象的 notify() 方法或 notifyAll() 方法,或者其他某個線程中斷當前線程,或者已超過某個實際時間量”,當前線程被喚醒進入“就緒狀態”。
需要注意的地方是,如果在一個地方用了某個對象的wait方法,必須要在另一個線程中使用notify來把它喚醒。
2.線程讓步方法yield
1) wait()是讓線程由“運行狀態”進入到“等待(阻塞)狀態”,而yield()是讓線程由“運行狀態”進入到“就緒狀態”。
2) wait()是會線程釋放它所持有對象的同步鎖,而yield()方法不會釋放鎖。
3)yield()雖然可以讓線程由“運行狀態”進入就緒狀態,但是不一定會讓其他線程獲取cpu的執行權。
3.線程休眠方法Sleep
sleep() 的作用是讓當前線程休眠,即當前線程會從“運行狀態”進入到“休眠(阻塞)狀態”。sleep()會指定休眠時間,線程休眠的時間會大于/等于該休眠時間;在線程重新被喚醒時,它會由“阻塞狀態”變成“就緒狀態”,從而等待cpu的調度執行。
wait()會釋放對象的同步鎖,而sleep()則不會釋放鎖。
4.join方法
join() 定義在Thread.java中
join() 的作用:讓“主線程”等待“子線程”結束之后才能繼續運行
join方法和wait方法的區別是喚醒的方式不同,wait通常要notify喚醒,join要等待調用join函數的線程對象執行完線程之后執行。
5.線程終止方法Interrupt
Thread.interrupt()方法不會中斷一個正在運行的線程。它的作用是,在線程受到阻塞時拋出一個中斷信號,這樣線程就得以退出阻塞的狀態。更確切的說,如果線程被Object.wait, Thread.join和Thread.sleep三種方法之一阻塞,那么,它將接收到一個中斷異常(InterruptedException),從而提早地終結被阻塞狀態。
6.線程優先級和守護線程
java 中的線程優先級的范圍是1~10,默認的優先級是5。“高優先級線程”會優先于“低優先級線程”執行。
用戶線程執行用戶級任務,而守護線程也就是“后臺線程”,一般用來執行后臺任務。需要注意的是:Java虛擬機在“用戶線程”都結束后會后退出。
總結
以上是生活随笔為你收集整理的多线程基础-常用线程方法(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 多线程基础-实现多线程的两种方式(二)
- 下一篇: JUC原子类-框架(一)