摘要:返回的是當(dāng)前線程即執(zhí)行這行代碼時所在的線程。告訴調(diào)度器當(dāng)前線程即執(zhí)行該行代碼所在的線程愿意放棄使用。只有在當(dāng)前線程持有自己的對象鎖時才能調(diào)用此方法,調(diào)用后就會釋放所持有的對象鎖和占用的資源,等待后才有可能再次獲取到所持有的對象鎖。
在Andorid-27中查看Thread源碼
第一次看Thread源碼的時候,很是懵,看源碼里面的注釋感覺實在無法理解,隨后在網(wǎng)上看各種關(guān)于Thread的講解,感覺這篇文章講的挺好的(文章地址:https://segmentfault.com/a/11...),對一些不理解的地方有所了解,然后再自己接著看源碼。
public static native Thread currentThread():Thread.currentThread()返回的是當(dāng)前線程(即執(zhí)行這行代碼時所在的線程)。 public static native void yield():Thread.yield():告訴調(diào)度器當(dāng)前線程(即執(zhí)行該行代碼所在的線程)愿意放棄使用CPU。但是調(diào)度器可以同意也可以不同意,就是你表達(dá)了你的意愿,但怎么做是我的事。 public static void sleep(long millis, int nanos)
從上圖中可以看出調(diào)用sleep方法后,當(dāng)前線程陷入死循環(huán)中并持有對象鎖直到millis時間過去,才開始向下執(zhí)行。
Thread.sleep(millis):當(dāng)前線程(即執(zhí)行該行代碼所在的線程)放棄它所占有的資源不再執(zhí)行,但依然擁有對象鎖,此時當(dāng)前線程處TIMED_WAITING狀態(tài),等到millis后,就變成就緒狀態(tài),等待分配CPU,分配到CPU就從sleep的地方開始向下執(zhí)行。
public synchronized void start() :調(diào)用start方法后,線程處于就緒狀態(tài),等待分配CPU,一旦分配到CPU之后就開始執(zhí)行run方法。 public void interrupt() :中斷線程
public final void join(long millis) throws InterruptedException :這個比較難理解,創(chuàng)建線程t,t.join加入到當(dāng)前線程(即執(zhí)行該行代碼所在的線程),然后當(dāng)前線程暫停執(zhí)行,若millis=0則當(dāng)前線程處于WAITING狀態(tài),等待加入的線程執(zhí)行完成后,當(dāng)前線程再接著執(zhí)行;若millis>0則當(dāng)前線程處于TIMED_WAITING狀態(tài),最多等待millis后,不論加入的線程是否執(zhí)行完畢,當(dāng)前線程都開始繼續(xù)執(zhí)行。
public final native void wait(long millis, int nanos) throws InterruptedException:讓當(dāng)前線程處于BLOCKED狀態(tài)。 只有在當(dāng)前線程持有自己的對象鎖時才能調(diào)用此方法,調(diào)用后就會釋放所持有的對象鎖和占用的資源,等待millis后才有可能再次獲取到所持有的對象鎖。
接下來我們來看看線程所擁有的幾種狀態(tài)State:
NEW:創(chuàng)建一個線程,但還未調(diào)用start方法。
RUNNABLE:包含兩種狀態(tài),運(yùn)行狀態(tài)和就緒狀態(tài),就緒狀態(tài)就是都準(zhǔn)備好了,等待分配CPU然后去執(zhí)行
BLOCKED:阻塞狀態(tài),等待獲取監(jiān)視器的鎖。在運(yùn)行時想要運(yùn)行同步方法或同步代碼塊但未獲取到對應(yīng)的鎖時會進(jìn)入到阻塞狀態(tài)。
WAITING:等待狀態(tài)。調(diào)用了wait()/join()/LockSupport.park()后,就會進(jìn)入該狀態(tài)。
TIMED_WAITING:處于等待狀態(tài)且有具體的等待時間。調(diào)用了Thread.sleep(long)/wait(long)/join(long)后,就會進(jìn)入該狀態(tài)。
TERMINATED:線程執(zhí)行完成。
狀態(tài)的切換如上圖所示,參考文章:https://blog.csdn.net/pange19...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/72078.html
摘要:如果線程還存活,線程就無限期等待,并讓出監(jiān)視器鎖,進(jìn)入狀態(tài)。當(dāng)線程從狀態(tài)被喚醒后通過,或者是假喚醒將繼續(xù)競爭監(jiān)視器鎖,當(dāng)成功獲得監(jiān)視器鎖后,他將從調(diào)用的地方恢復(fù),繼續(xù)運(yùn)行。 前言 系列文章目錄 上一篇我們討論了線程的創(chuàng)建,本篇我們來聊一聊線程的狀態(tài)轉(zhuǎn)換以及常用的幾個比較重要的方法。 本篇依然是通過源碼分析來了解這些知識。 本文源碼基于jdk1.8 。 閱讀完本文,你應(yīng)當(dāng)有能力回答以...
摘要:源碼閱讀創(chuàng)建鎖和同步類中使用的基礎(chǔ)的線程阻塞原語除非你是多線程專家,而且你要自己設(shè)計和實現(xiàn)阻塞式線程同步機(jī)制比如等等,否則你不需要用和。 LockSupport源碼閱讀 /* * 創(chuàng)建鎖和同步類中使用的基礎(chǔ)的線程阻塞原語 * * 除非你是多線程專家,而且你要自己設(shè)計和實現(xiàn)阻塞式線程同步機(jī)制(比如lock、condition等等),否則你不需要用park和unpark。這兩個原語是...
摘要:前言中的線程是使用類實現(xiàn)的,在初學(xué)的時候就學(xué)過了,也在實踐中用過,不過一直沒從源碼的角度去看過它的實現(xiàn),今天從源碼的角度出發(fā),再次學(xué)習(xí),愿此后對的實踐更加得心應(yīng)手。如果一個線程已經(jīng)啟動并且尚未死亡,則該線程處于活動狀態(tài)。 showImg(https://segmentfault.com/img/remote/1460000017963014?w=1080&h=720); 前言 Java...
摘要:接下來就是會把任務(wù)提交到隊列中給線程池調(diào)度處理因為主要關(guān)心的是這個線程怎么執(zhí)行,異常的拋出和處理,所以我們暫時不解析多余的邏輯。 前言 今天遇到了一個bug,現(xiàn)象是,一個任務(wù)放入線程池中,似乎沒有被執(zhí)行,日志也沒有打。 經(jīng)過本地代碼調(diào)試之后,發(fā)現(xiàn)在任務(wù)邏輯的前半段,拋出了NPE,但是代碼外層沒有try-catch,導(dǎo)致這個異常被吃掉。 這個問題解決起來是很簡單的,外層加個try-cat...
閱讀 3245·2021-09-22 16:06
閱讀 3236·2021-09-02 15:40
閱讀 632·2019-08-30 15:54
閱讀 1035·2019-08-26 12:22
閱讀 1375·2019-08-26 12:17
閱讀 2742·2019-08-26 12:09
閱讀 502·2019-08-26 10:20
閱讀 783·2019-08-23 16:28