java 线程之线程状态
Thread?類(lèi)中的線(xiàn)程狀態(tài):
public enum State {NEW,//新建RUNNABLE,// 執(zhí)行態(tài)BLOCKED, //等待鎖(在獲取鎖的池子里)WAITING,//等待狀態(tài)TIMED_WAITING,//定時(shí)等待TERMINATED; //終止 }創(chuàng)建狀態(tài)(NEW):當(dāng)一個(gè)線(xiàn)程創(chuàng)建以后,就處于創(chuàng)建狀態(tài)。Thread? ?th= new?Thread(()->{ });
等待鎖(BLOCKED):當(dāng)線(xiàn)程調(diào)用 th.start()?方法,表明該線(xiàn)程具備獲取鎖的資格,進(jìn)入等待鎖的池子中。
可運(yùn)行狀態(tài):當(dāng)線(xiàn)程?th?獲取到鎖之后就進(jìn)入該狀態(tài)(該狀態(tài)并不存在Thread?類(lèi)中,但是操作系統(tǒng)是否執(zhí)行線(xiàn)程,是根據(jù)是否分配時(shí)間片來(lái)決定的)。
執(zhí)行態(tài)(RUNNABLE):當(dāng)可運(yùn)行態(tài)的線(xiàn)程?th?獲取到cpu的時(shí)間片以后就進(jìn)入執(zhí)行。
終止態(tài)(TERMINATED):線(xiàn)程執(zhí)行完畢,或者出現(xiàn)異常。
阻塞狀態(tài):在?Thread?源碼里沒(méi)有改狀態(tài)但是在《操作系統(tǒng)原理》中線(xiàn)程是存在該狀態(tài)的。阻塞態(tài)的線(xiàn)程是沒(méi)有釋放自己本身持有的鎖(例如線(xiàn)程運(yùn)行時(shí)需要外部I/O資源,打印機(jī)、調(diào)用sleep()方法。)只是由于外部提出了干預(yù),等外部事件執(zhí)行完畢后,可直接進(jìn)入可運(yùn)行狀態(tài)。
等待狀態(tài)(WAITING): 一個(gè)處于運(yùn)行狀態(tài)的線(xiàn)程還可能調(diào)用wait()方法、該方法會(huì)使調(diào)用的線(xiàn)程釋放對(duì)象鎖釋,所以線(xiàn)程將進(jìn)入等待獲取鎖的隊(duì)列里面。join()?方法同理,join()方法底層使用的wait(),只不過(guò)Join()方法作用于當(dāng)前執(zhí)行的線(xiàn)程中。通過(guò)調(diào)用notify()或notifyAll()這兩個(gè)方法來(lái)喚醒線(xiàn)程然后進(jìn)入鎖池狀態(tài)。進(jìn)入鎖池狀態(tài)以后繼續(xù)參與鎖的競(jìng)爭(zhēng)。
定時(shí)等待狀態(tài)(TIMED_WAITING):調(diào)用?帶參數(shù)的wait(long num)?方法。該方法等定時(shí)一到自動(dòng)會(huì)喚醒線(xiàn)程然后進(jìn)入鎖池狀態(tài)。進(jìn)入鎖池狀態(tài)以后繼續(xù)參與鎖的競(jìng)爭(zhēng)。
掛起狀態(tài):當(dāng)一個(gè)處于運(yùn)行狀態(tài)的線(xiàn)程調(diào)用了suspend()方法以后,它就會(huì)進(jìn)入掛起狀態(tài)(這一方法已經(jīng)過(guò)時(shí)不建議使用)。掛起狀態(tài)的線(xiàn)程也沒(méi)有釋放對(duì)象鎖,它需要調(diào)用resume()方法以后才能恢復(fù)到可運(yùn)行狀態(tài)。將線(xiàn)程掛起容易導(dǎo)致程序死鎖。
?
轉(zhuǎn)載于:https://www.cnblogs.com/jalja/p/11451981.html
總結(jié)
以上是生活随笔為你收集整理的java 线程之线程状态的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 分期乐被冻结怎么解决?分期乐被冻结的解决
- 下一篇: 操作系统原理之内存管理(第四章第二部分)