最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Thread線程的基礎(chǔ)知識(shí)及常見疑惑點(diǎn)總結(jié)

 更新時(shí)間:2019年05月26日 11:06:03   投稿:laozhang  
在本篇內(nèi)容里小編給大家分享的是關(guān)于Thread線程的基礎(chǔ)知識(shí)及常見疑惑點(diǎn),對(duì)此有學(xué)習(xí)需求的朋友們可以學(xué)習(xí)參考下。

引言

相信各位道友在平時(shí)工作中已經(jīng)很少直接用到Thread線程類了,現(xiàn)在大多是通過線程池或者一些多線程框架來操作線程任務(wù),但我覺得還是有必要了解清楚Thread線程類中各種方法的含義,了解了底層才能更好的理解框架、應(yīng)用框架。下面我就將Thread線程的相關(guān)基礎(chǔ)點(diǎn)總結(jié)一二,以供觀瞻。

正文

1、Thread線程的狀態(tài)

根據(jù)《深入理解Java虛擬機(jī)》一書的講述,Java語言定義了五種線程狀態(tài),分別為:創(chuàng)建(new)、運(yùn)行(Runnable)、等待(waiting)、阻塞(blocked)、結(jié)束(terminated)。而且規(guī)定,在某一個(gè)時(shí)間點(diǎn),每個(gè)線程能且只能處于其中的一種狀態(tài)。

其中,運(yùn)行狀態(tài)又包括就緒(Ready)跟正在運(yùn)行(Running),區(qū)別就是是否獲得了CPU的執(zhí)行時(shí)間。

對(duì)于等待跟阻塞狀態(tài),需要著重說明一下,因?yàn)榇颂帢O易搞錯(cuò),而且也是面試常被問到的點(diǎn)。等待狀態(tài),一般由Object.wait()、Thread.sleep()、Thread.join()、LockSupport.park()等方法以及這些方法帶時(shí)間控制的同類方法實(shí)現(xiàn)線程的等待。而阻塞狀態(tài),一般是由于當(dāng)前線程還未獲取到獨(dú)占鎖且正在等待獲取,此時(shí)稱為阻塞??梢詫⒌却醋鲋鲃?dòng)的線程暫停執(zhí)行,以為需要調(diào)用特定的方法線程才會(huì)等待;而阻塞可以看做是被動(dòng)的線程暫定執(zhí)行,因?yàn)榫€程在等著獲取獨(dú)占鎖。

2、Thread線程的相關(guān)方法

start()方法/run()方法:有時(shí)在面試的時(shí)候,面試官會(huì)問到調(diào)用線程的start方法跟直接調(diào)用run方法有什么區(qū)別?雖然有的道友看到這里會(huì)覺得問這種問題的面試官有點(diǎn)很沒必要,但我還是說一下。調(diào)用start方法后,最終會(huì)調(diào)用Thread類中的一個(gè)本地方法start0,這個(gè)方法可以新建一個(gè)線程來運(yùn)行你的run方法,而調(diào)用run方法后只是在當(dāng)前線程上運(yùn)行你的run方法,并沒有新線程參與。

wait()方法/sleep()方法:請(qǐng)注意,這里很多人都會(huì)記錯(cuò),wait方法以及跟它配套的notify/notifyAll方法,是位于頂級(jí)父類Object下的,而其他操作線程的方法都在Thread線程類下。為什么要將wait方法放在Object下呢?其實(shí)這是由wait/notify方法的實(shí)現(xiàn)原理決定的。wait方法調(diào)用了之后,會(huì)釋放鎖,并讓當(dāng)前線程等待,而對(duì)于java的原生鎖synchronized,是隸屬于一個(gè)特定對(duì)象的監(jiān)視器monitor的,那這個(gè)釋放的是鎖誰的鎖?不能是別人的,只能是調(diào)用wait方法的那個(gè)對(duì)象的。而這個(gè)鎖是哪里來的?要釋放鎖,肯定之前加過鎖,在哪里加的呢?只能是在synchronized塊中給這個(gè)對(duì)象加的,所以這也解釋了為什么wait/notify方法一直要跟synchronized一起用,因?yàn)樗鼈z就是通過操作對(duì)象的鎖實(shí)現(xiàn)的等待和喚醒。相比而言sleep方法單純很多,它只是讓當(dāng)前線程睡眠一段時(shí)間,并不會(huì)涉及到對(duì)鎖的操作,所以直接放在Thread類中就行。對(duì)于wait跟notify的演示如下:

public static void main(String[] args) throws InterruptedException {
    Object obj = new Object();
    Thread thread = new Thread(new Runnable() {
      @Override
      public void run() {
        synchronized (obj) {
          try {
            System.out.println("thread獲取到鎖,觸發(fā)wait");
            obj.wait();
            System.out.println("wait over");
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
        }
      }
    });
    Thread thread1 = new Thread(new Runnable() {
      @Override
      public void run() {
        synchronized (obj) {
          try {
            System.out.println("thread1獲取到鎖");
            Thread.sleep(1000);
            System.out.println("1秒后喚醒");
            obj.notify();
          } catch (Exception e) {
            e.printStackTrace();
          }
          System.out.println("notify over");
        }

      }
    });
    thread.start();
    thread1.start();
  }

執(zhí)行結(jié)果為:

thread獲取到鎖,觸發(fā)wait
thread1獲取到鎖
1秒后喚醒
notify over
wait over

LockSupport.park():另外還有JUC包中的park方法讓當(dāng)前線程等待。此方法是使用CAS實(shí)現(xiàn)的線程等待,不會(huì)釋放鎖。而park/unpark方法比wait/notify這一對(duì)好的地方在于,前者可以先unpark在park,這是線程仍然會(huì)繼續(xù)執(zhí)行;而對(duì)于wait/notify,則需要通過程序控制執(zhí)行順序,一定要先wait在notify/notifyAll,否則順序反了線程就會(huì)一直等待下去,由此悲劇誕生... 比如講上述wait/notify的代碼34行35行調(diào)換一下順序,執(zhí)行結(jié)果如下所示:

thread1獲取到鎖
1秒后喚醒
notify over
thread獲取到鎖,觸發(fā)wait

仿佛云天明對(duì)程心那一千八百萬年的等待

join()/yield():對(duì)于Thread下的這兩個(gè)方法,之所以放在一起講解,就是因?yàn)檫@兩個(gè)方法平時(shí)比較少用到,屬于閑云野鶴的存在。

yield()方法是讓當(dāng)前線程讓步,讓步的意思就是放棄執(zhí)行權(quán),即當(dāng)前線程會(huì)從上述說的運(yùn)行狀態(tài)runnable中的running狀態(tài)進(jìn)入ready就緒狀態(tài),但是虛擬機(jī)不保證當(dāng)前線程執(zhí)行了yield方法后不會(huì)緊接著再次進(jìn)去running狀態(tài),因?yàn)榭赡蹸PU分配執(zhí)行時(shí)間時(shí)又分給了當(dāng)前線程。所以這個(gè)方法其實(shí)一般也沒啥用,因?yàn)樾Ч环€(wěn)定。

join()方法是將調(diào)用join的線程插入當(dāng)前線程的執(zhí)行過程中,即讓當(dāng)前線程等待,先執(zhí)行完調(diào)用join的線程,再繼續(xù)執(zhí)行當(dāng)前線程。注意join方法不會(huì)釋放鎖。join的演示代碼如下:

public class RunnableThread implements Runnable{
  @Override
  public void run() {
    System.out.println("runnable run");
    try {
      System.out.println("開始睡眠");
      Thread.sleep(5000);
      System.out.println("睡了5秒");
    } catch (Exception e) {
      System.out.println("runnable exception:" + e);
    }
  }

  public static void main(String[] args) throws InterruptedException {
    Object obj = new Object();
    Thread thread = new Thread(new RunnableThread());
    thread.start();
    thread.join();
    System.out.println("end");
  }
}

執(zhí)行結(jié)果為:

runnable run
開始睡眠
睡了5秒
end

結(jié)束語

這次先到這里,上述說的東西,雖然很小,而且實(shí)際中不會(huì)直接用到,但是對(duì)于我們理解線程的運(yùn)行機(jī)制、理解多線程框架都有好處,所以還是有必要在自己的學(xué)習(xí)地圖上理解清楚。其實(shí)線程還有一個(gè)很重要的點(diǎn)就是線程的中斷,多線程框架或者JUC包的源碼中都會(huì)涉及到對(duì)線程中斷的處理以及響應(yīng),這一塊我會(huì)在后面梳理清楚了之后專門整理出來。最近覺得學(xué)習(xí)進(jìn)入了停滯期,有點(diǎn)不知道從何下手,覺得需要學(xué)的東西太多。在這里,想跟各位道友討教一下,一個(gè)資質(zhì)普通的開發(fā)者,如何才能將自己的實(shí)力提升到一個(gè)比較高的層次(比如阿里的P6P7及以上?)歡迎留言賜教,在此不勝感激!

相關(guān)文章

  • Java實(shí)現(xiàn)斗地主之洗牌發(fā)牌

    Java實(shí)現(xiàn)斗地主之洗牌發(fā)牌

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)斗地主之洗牌發(fā)牌,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • Spring IO Platform簡(jiǎn)單介紹

    Spring IO Platform簡(jiǎn)單介紹

    這篇文章主要介紹了Spring IO Platform簡(jiǎn)單介紹,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2017-12-12
  • springboot+vue實(shí)現(xiàn)oss文件存儲(chǔ)的示例代碼

    springboot+vue實(shí)現(xiàn)oss文件存儲(chǔ)的示例代碼

    對(duì)象存儲(chǔ)服務(wù)是一種海量、安全、低成本、高可靠的云存儲(chǔ)服務(wù),本文主要介紹了springboot+vue實(shí)現(xiàn)oss文件存儲(chǔ)的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • 淺談Mybatis樂觀鎖插件

    淺談Mybatis樂觀鎖插件

    這篇文章主要介紹了淺談Mybatis樂觀鎖插件,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-12-12
  • Hibernate用ThreadLocal模式(線程局部變量模式)管理Session

    Hibernate用ThreadLocal模式(線程局部變量模式)管理Session

    今天小編就為大家分享一篇關(guān)于Hibernate用ThreadLocal模式(線程局部變量模式)管理Session,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • java正則表達(dá)式匹配所有數(shù)字的案例

    java正則表達(dá)式匹配所有數(shù)字的案例

    這篇文章主要介紹了java正則表達(dá)式匹配所有數(shù)字的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 教你java面試時(shí)如何聊單例模式

    教你java面試時(shí)如何聊單例模式

    這篇文章主要給大家介紹了關(guān)于Java單例模式推薦的幾種模式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-06-06
  • MyBatis中多條件查詢商品的三種方法及區(qū)別

    MyBatis中多條件查詢商品的三種方法及區(qū)別

    本文主要介紹了MyBatis中多條件查詢商品的三種方法及區(qū)別,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Java讀寫Windows共享文件夾的方法實(shí)例

    Java讀寫Windows共享文件夾的方法實(shí)例

    本篇文章主要介紹了Java讀寫Windows共享文件夾的方法實(shí)例,具有一定的參考價(jià)值,有興趣的同學(xué)可以了解一下。
    2016-11-11
  • java獲取和設(shè)置系統(tǒng)變量問題(環(huán)境變量)

    java獲取和設(shè)置系統(tǒng)變量問題(環(huán)境變量)

    這篇文章主要介紹了java獲取和設(shè)置系統(tǒng)變量問題(環(huán)境變量),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01

最新評(píng)論

措勤县| 融水| 沽源县| 罗田县| 长治市| 大方县| 公安县| 宁蒗| 富川| 海晏县| 微山县| 和静县| 固原市| 湘乡市| 新密市| 陆河县| 卫辉市| 山阳县| 蕉岭县| 青浦区| 淳化县| 阳朔县| 奈曼旗| 会昌县| 邻水| 益阳市| 壤塘县| 庆阳市| 大连市| 东阳市| 海晏县| 太原市| 柏乡县| 万载县| 穆棱市| 香格里拉县| 浪卡子县| 金寨县| 米林县| 福州市| 衡山县|