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