欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Java中線程的狀態(tài)分別有哪幾種

本篇內(nèi)容介紹了“Java中線程的狀態(tài)分別有哪幾種”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供內(nèi)蒙古網(wǎng)站建設、內(nèi)蒙古做網(wǎng)站、內(nèi)蒙古網(wǎng)站設計、內(nèi)蒙古網(wǎng)站制作等企業(yè)網(wǎng)站建設、網(wǎng)頁設計與制作、內(nèi)蒙古企業(yè)網(wǎng)站模板建站服務,十載內(nèi)蒙古做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡服務。

Java中線程的狀態(tài)分為6種。  

1. 初始(NEW):新創(chuàng)建了一個線程對象,但還沒有調(diào)用start()方法。

2. 運行(RUNNABLE):Java線程中將就緒(ready)和運行中(running)兩種狀態(tài)籠統(tǒng)地稱為“運行”。 線程對象創(chuàng)建后,其他線程(比如main線程)調(diào)用了該對象的start()方法。該狀態(tài)的線程位于可運行線程池中,等待被線程調(diào)度選中,獲取CPU的使用權(quán),此時處于就緒狀態(tài)(ready)。就緒狀態(tài)的線程在獲得CPU時間片后變?yōu)檫\行中狀態(tài)(running)。

3.阻塞(BLOCKED):表示線程阻塞于鎖。

4.等待(WAITING):進入該狀態(tài)的線程需要等待其他線程做出一些特定動作(通知或中斷)。

5.超時等待(TIMED_WAITING):該狀態(tài)不同于WAITING,它可以在指定的時間后自行返回。

6. 終止(TERMINATED):表示該線程已經(jīng)執(zhí)行完畢。

線程的狀態(tài)圖

Java中線程的狀態(tài)分別有哪幾種

1. 初始狀態(tài) 

實現(xiàn)Runnable接口和繼承Thread可以得到一個線程類,new一個實例出來,線程就進入了初始狀態(tài)。

2.1. 就緒狀態(tài)

就緒狀態(tài)只是說你資格運行,調(diào)度程序沒有挑選到你,你就永遠是就緒狀態(tài)。調(diào)用線程的start()方法,此線程進入就緒狀態(tài)。當前線程sleep()方法結(jié)束,其他線程join()結(jié)束,等待用戶輸入完畢,某個線程拿到對象鎖,這些線程也將進入就緒狀態(tài)。當前線程時間片用完了,調(diào)用當前線程的yield()方法,當前線程進入就緒狀態(tài)。鎖池里的線程拿到對象鎖后,進入就緒狀態(tài)。

2.2.運行中狀態(tài)

線程調(diào)度程序從可運行池中選擇一個線程作為當前線程時線程所處的狀態(tài)。這也是線程進入運行狀態(tài)的唯一一種方式。

3. 阻塞狀態(tài)

阻塞狀態(tài)是線程阻塞在進入synchronized關(guān)鍵字修飾的方法或代碼塊(獲取鎖)時的狀態(tài)。

4. 等待

處于這種狀態(tài)的線程不會被分配CPU執(zhí)行時間,它們要等待被顯式地喚醒,否則會處于無限期等待的狀態(tài)。

5. 超時等待

處于這種狀態(tài)的線程不會被分配CPU執(zhí)行時間,不過無須無限期等待被其他線程顯示地喚醒,在達到一定時間后它們會自動喚醒。

6. 終止狀態(tài)

當線程的run()方法完成時,或者主線程的main()方法完成時,我們就認為它終止了。這個線程對象也許是活的,但是,它已經(jīng)不是一個單獨執(zhí)行的線程。線程一旦終止了,就不能復生。   在一個終止的線程上調(diào)用start()方法,會拋出java.lang.IllegalThreadStateException異常。

7.等待隊列

調(diào)用obj的wait(), notify()方法前,必須獲得obj鎖,也就是必須寫在synchronized(obj) 代碼段內(nèi)。 與等待隊列相關(guān)的步驟和圖

Java中線程的狀態(tài)分別有哪幾種

  1. 線程1獲取對象A的鎖,正在使用對象A。

  2. 線程1調(diào)用對象A的wait()方法。

  3. 線程1釋放對象A的鎖,并馬上進入等待隊列。

  4. 鎖池里面的對象爭搶對象A的鎖。

  5. 線程5獲得對象A的鎖,進入synchronized塊,使用對象A。

  6. 線程5調(diào)用對象A的notifyAll()方法,喚醒所有線程,所有線程進入同步隊列。若線程5調(diào)用對象A的notify()方法,則喚醒一個線程,不知道會喚醒誰,被喚醒的那個線程進入同步隊列。

  7. notifyAll()方法所在synchronized結(jié)束,線程5釋放對象A的鎖。

  8. 同步隊列的線程爭搶對象鎖,但線程1什么時候能搶到就不知道了。

同步隊列狀態(tài)

當前線程想調(diào)用對象A的同步方法時,發(fā)現(xiàn)對象A的鎖被別的線程占有,此時當前線程進入同步隊列。簡言之,同步隊列里面放的都是想爭奪對象鎖的線程。

當一個線程1被另外一個線程2喚醒時,1線程進入同步隊列,去爭奪對象鎖。同步隊列是在同步的環(huán)境下才有的概念,一個對象對應一個同步隊列。

幾個方法的比較

Thread.sleep(long millis),一定是當前線程調(diào)用此方法,當前線程進入TIMED_WAITING狀態(tài),但不釋放對象鎖,millis后線程自動蘇醒進入就緒狀態(tài)。作用:給其它線程執(zhí)行機會的最佳方式。

Thread.yield(),一定是當前線程調(diào)用此方法,當前線程放棄獲取的CPU時間片,但不釋放鎖資源,由運行狀態(tài)變?yōu)榫途w狀態(tài),讓OS再次選擇線程。作用:讓相同優(yōu)先級的線程輪流執(zhí)行,但并不保證一定會輪流執(zhí)行。實際中無法保證yield()達到讓步目的,因為讓步的線程還有可能被線程調(diào)度程序再次選中。Thread.yield()不會導致阻塞。該方法與sleep()類似,只是不能由用戶指定暫停多長時間。

t.join()/t.join(long millis),當前線程里調(diào)用其它線程t的join方法,當前線程進入WAITING/TIMED_WAITING狀態(tài),當前線程不會釋放已經(jīng)持有的對象鎖。線程t執(zhí)行完畢或者millis時間到,當前線程進入就緒狀態(tài)。

obj.wait(),當前線程調(diào)用對象的wait()方法,當前線程釋放對象鎖,進入等待隊列。依靠notify()/notifyAll()喚醒或者wait(long timeout) timeout時間到自動喚醒。

obj.notify()喚醒在此對象監(jiān)視器上等待的單個線程,選擇是任意性的。notifyAll()喚醒在此對象監(jiān)視器上等待的所有線程。

“Java中線程的狀態(tài)分別有哪幾種”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

本文名稱:Java中線程的狀態(tài)分別有哪幾種
當前路徑:http://chinadenli.net/article6/goidig.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供云服務器靜態(tài)網(wǎng)站Google網(wǎng)站設計公司品牌網(wǎng)站設計建站公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化