在沒有學習Java多線程之前,總以爲多線程是個很神祕的東西,只有那些大神才能駕馭,新年假期沒事就來學習和了解一下Java的多線程,本篇博客咱們就來從頭說一下多線程究竟是怎麼回事。java
1.進程的概念多線程
每個正在運行的程序都是一個進程,它是系統進行資源分配和調用的獨立單位。且 每個進程都有本身的內存空間和系統資源。ide
2.線程的概念學習
是進程中的單個順序控制流,是一條執行路徑。每一個進程均可以擁有一個或者多個線程。各個線程之間都共享所屬的那個進程的內存空間和系統資源。線程
3.單線程和多線程程序的辨別方式設計
若是一個進程只有一條執行路徑,則稱爲單線程程序。 若是一個進程有多條執行路徑,則稱爲多線程程序(經典應用程序:掃雷、迅雷下載)。對象
廢話很少說,咱們直接上圖來解釋blog
4.站在線程的角度來解釋Java程序運行某各種的main方法繼承
首先java 命令會啓動 java 虛擬機,即啓動 JVM,等於啓動了一個應用程序,也就是啓動了一個進程。該進程會自動啓動一個 「主線程」 ,而後主線程去調用某個類的 main 方法。因此 main方法運行在主線程中。在此以前的全部程序都是單線程的。接口
1.方式一:繼承Thread類,重寫run方法。
幾個須要注意的問題:
答:咱們只有把想要在線程中運行的代碼寫在run方法裏才能啓動線程進行運行。
答:啓動使用的是start方法。
答:一個線程只能啓動一次,不然會報IllegalThreadStateException異常。
答:run()方法是普通的方法調用,並非啓用線程,而start方法是首先啓動一個新的線程,而後運行run()方法裏面的代碼。
2.方式二:實現Runnable接口
該實現方式優勢:
能夠避免因爲Java單繼承帶來的侷限性。 適合多個相同程序的代碼去處理同一個資源的狀況。
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();
public final void setDaemon(boolean on);
上圖中的關羽和張飛能夠當作守護線程,當劉備主線程消亡之後,二者都不可能再具備得到CPU執行權的資格。
中斷線程:
public final void stop();(已過期,直接將虛擬機退出)
public void interrupt();(建議使用,是中斷線程而且拋出一個InterruptedException異常,虛擬機不會退出,線程以後的代碼會繼續執行)
4.線程生命週期
1).建立:新建線程對象。
2).就緒:線程對象已經啓動,已經具備得到CPU的資格,但沒有獲取執行權。
3).運行:得到了CPU的執行權,執行線程。
4).阻塞:沒有CPU的執行權,只能等待會到就緒狀態。
5).死亡:線程代碼運行完畢,線程消亡。
嫌文字很差理解,直接上圖說明: