我這樣理解多線程之一-初識多線程

初識多線程

1 線程的基本概念理解
   爲了更好的學習多線程,我們先來看看線程中的那些基本概念都代表什麼含義?
   進程: 是指運行中的應用程序,每個進程都有自己獨立的地址空間(內存空間),意思就是每啓動一個進程就會分配一個獨立的內存空間。
   線程:線程是進程的一個實體,是程序運行調度和分配的基本單位。它本省並沒有獨立的內存空間,寄生在進程。同一個進程的多個線程之間是可以共享資源的。
   多線程:指程序運行時(一個進程)不止產生了一個線程,多線程的出現,是爲了我們更加充分的利用cpu資源,如果只有一個單線程,那麼系統的執行能力就會特別低下,運行效率大大降低。
看了很多大神的帖子後,我決定用自己的理解來給併發和並行做個解釋:
  並行:即同時執行多個任務,是依託多核系統進行的,單核的系統是沒有並行概念的。
  併發:即同一時刻執行多個任務,是依託線程的概念進行的。

   在 SMP 和多核架構出現之前,大多數計算機系統只有單個處理器。CPU 調度器通過快速切換系統內的進程,以便允許每個進程取得進展,從而提供並行假象。這些進程併發運行,而非並行運行。
隨着系統線程數量從幾十個到幾千上萬個,CPU 設計人員通過增加硬件來改善線程性能的提高系統性能。現代 Intel CPU 的每個核經常支持兩個線程,而 Oracle T4 CPU 的每個核支持 8 個線程。這種支持意味着,可以將多個線程加載到處理核以便快速切換。毫無疑問,多核計算機將繼續增加多核數量和硬件線程支持。
2 線程的生命週期
   既然談到線程,那必然有其存在的規律,即生命週期,從出生到死亡…
線程可分爲以下幾個階段:

  • 1>新建 :從新建一個線程對象到程序start() 這個線程之間的狀態,都是新建狀態;
  • 2>就緒 :線程對象調用start()方法後,就處於就緒狀態,等到JVM裏的線程調度器的調度;
  • 3>運行 :就緒狀態下的線程在獲取CPU資源後就可以執行run(),此時的線程便處於運行狀態,運行狀態的線程可變爲就緒、阻塞及死亡三種狀態。
  • 4>等待/阻塞/睡眠 :在一個線程執行了sleep(睡眠)、suspend(掛起)等方法後會失去所佔有的資源,從而進入阻塞狀態,在睡眠結束後可重新進入就緒狀態。
  • 5>終止 :run()方法完成後或發生其他終止條件時就會切換到終止狀態。
      通過上面可以看到,線程的運行圍繞着一個run()方法,調用run()方法線程開始運行,運行結束,線程即終止。start()只是讓程序處於就緒狀態,隨時準備運行。在程序運行中可抵用sleep() suspend()將程序人爲干預進阻塞狀態,這種狀態結束後才能重新進入就緒狀態。

3 線程的創建方式

  • 1、繼承Thread類:
       步驟:①、定義類繼承Thread;
          ②、複寫Thread類中的run方法;目的:將自定義代碼存儲在run方法,讓線程運行
          ③、調用線程的start方法:
        該方法有兩步:啓動線程,調用run方法。

  • 2、實現Runnable接口: 接口應該由那些打算通過某一線程執行其實例的類來實現。類必須定義一個稱爲run 的無參方法。
     實現步驟:①、定義類實現Runnable接口
          ②、覆蓋Runnable接口中的run方法將線程要運行的代碼放在該run方法中。
          ③、通過Thread類建立線程對象。
          ④、將Runnable接口的子類對象作爲實際參數傳遞給Thread類的構造函數。
    自定義的run方法所屬的對象是Runnable接口的子類對象。所以要讓線程執行指定對象的run方法就要先明確run方法所屬對象
          ⑤、調用Thread類的start方法開啓線程並調用Runnable接口子類的run方法。

  • 3、通過Callable和Future創建線程:
        實現步驟:①、創建Callable接口的實現類,並實現call()方法,改方法將作爲線程執行體,且具有返回值。
             ②、創建Callable實現類的實例,使用FutrueTask類進行包裝Callable對象,FutureTask對象封裝了Callable對象的call()方法的返回值
             ③、使用FutureTask對象作爲Thread對象啓動新線程。
             ④、調用FutureTask對象的get()方法獲取子線程執行結束後的返回值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章