深刻聊聊Java多線程

1、背景

  在沒有學習Java多線程之前,總以爲多線程是個很神祕的東西,只有那些大神才能駕馭,新年假期沒事就來學習和了解一下Java的多線程,本篇博客咱們就來從頭說一下多線程究竟是怎麼回事。java

2、概述

1.進程的概念多線程

  每個正在運行的程序都是一個進程,它是系統進行資源分配和調用的獨立單位。且 每個進程都有本身的內存空間和系統資源。ide

2.線程的概念學習

  是進程中的單個順序控制流,是一條執行路徑。每一個進程均可以擁有一個或者多個線程。各個線程之間都共享所屬的那個進程的內存空間和系統資源。線程

3.單線程和多線程程序的辨別方式設計

  若是一個進程只有一條執行路徑,則稱爲單線程程序。 若是一個進程有多條執行路徑,則稱爲多線程程序(經典應用程序:掃雷、迅雷下載)。對象

廢話很少說,咱們直接上圖來解釋blog

   深刻聊聊Java多線程 

4.站在線程的角度來解釋Java程序運行某各種的main方法繼承

  首先java 命令會啓動 java 虛擬機,即啓動 JVM,等於啓動了一個應用程序,也就是啓動了一個進程。該進程會自動啓動一個 「主線程」 ,而後主線程去調用某個類的 main 方法。因此 main方法運行在主線程中。在此以前的全部程序都是單線程的。接口

3、多線程程序的實現方式

1.方式一:繼承Thread類,重寫run方法。

深刻聊聊Java多線程
幾個須要注意的問題:

  • 爲何要重寫run()方法?

  答:咱們只有把想要在線程中運行的代碼寫在run方法裏才能啓動線程進行運行。

  • 啓動線程使用的是那個方法?

  答:啓動使用的是start方法。

  • 線程能不能屢次啓動?

  答:一個線程只能啓動一次,不然會報IllegalThreadStateException異常。

  • run()和start()方法的區別?

  答:run()方法是普通的方法調用,並非啓用線程,而start方法是首先啓動一個新的線程,而後運行run()方法裏面的代碼。

2.方式二:實現Runnable接口
深刻聊聊Java多線程

該實現方式優勢:

  • 能夠避免因爲Java單繼承帶來的侷限性。 適合多個相同程序的代碼去處理同一個資源的狀況。

  • 把線程同程序的代碼,數據有效分離,較好的體現了面向對象的設計思想。

4、線程基本操做

1.獲取和設置線程名稱

  public final String getName();

  public final void setName(String name);

  其實經過構造方法也能夠設置線程名稱.

  public static Thread currentThread():獲取任意方法所在的線程名稱.

2.線程調度

  1).之因此出現線程調度是由於計算機只有一個 CPU,那麼 CPU 在某一個時刻只能執行一條指令,線程只有獲得 CPU時間片,也就是使用權,才能夠執行指令。

  2).線程的兩種調度模型(Java使用的是搶佔式調度模型).

  • 分時調度模型:全部線程輪流使用 CPU 的使用權,平均分配每一個線程佔用 CPU 的時間片。

  • 搶佔式調度模型:優先讓優先級高的線程使用 CPU,若是線程的優先級相同,那麼會隨機選擇一個,優先級高的線程獲取的 CPU 時間片相對多一些。

  • 獲取和設置線程優先級的方法:

   public final int getPriority();

   public final void setPriority(int newPriority);

3.線程控制

  • 線程休眠:public static void sleep(long millis);

  • 線程加入:public final void join();

  • 線程禮讓:public static void yield();

  • 設置是否爲守護線程(當全部的線程都爲守護線程就不具備搶佔CPU執行權的資格):

  public final void setDaemon(boolean on);    
深刻聊聊Java多線程
上圖中的關羽和張飛能夠當作守護線程,當劉備主線程消亡之後,二者都不可能再具備得到CPU執行權的資格。

中斷線程:

  public final void stop();(已過期,直接將虛擬機退出)

  public void interrupt();(建議使用,是中斷線程而且拋出一個InterruptedException異常,虛擬機不會退出,線程以後的代碼會繼續執行)

4.線程生命週期

 1).建立:新建線程對象。

 2).就緒:線程對象已經啓動,已經具備得到CPU的資格,但沒有獲取執行權。

 3).運行:得到了CPU的執行權,執行線程。

 4).阻塞:沒有CPU的執行權,只能等待會到就緒狀態。

 5).死亡:線程代碼運行完畢,線程消亡。

  嫌文字很差理解,直接上圖說明:
深刻聊聊Java多線程

相關文章
相關標籤/搜索