本文目錄java
線程是什麼?
線程(Thread)是一個對象(Object)。用來幹什麼?Java 線程(也稱 JVM 線程)是 Java 進程內容許多個同時進行的任務。該進程內併發的任務成爲線程(Thread),一個進程裏至少一個線程。git
Java 程序採用多線程方式來支持大量的併發請求處理,程序若是在多線程方式執行下,其複雜度遠高於單線程串行執行。那麼多線程:指的是這個程序(一個進程)運行時產生了不止一個線程。github
爲啥使用多線程?算法
聊到多線程,多半會聊併發與並行,咋理解並區分這兩個的區別呢?編程
Java 建立線程對象有兩種方法:設計模式
新建 MyThread 對象,代碼以下:多線程
/** * 繼承 Thread 類建立線程對象 * @author Jeff Lee @ bysocket.com * @since 2018年01月27日21:03:02 */ public class MyThread extends Thread { @Override // 能夠省略 public void run() { System.out.println("MyThread 的線程對象正在執行任務"); } public static void main(String[] args) { for (int i = 0; i < 10; i++) { MyThread thread = new MyThread(); thread.start(); System.out.println("MyThread 的線程對象 " + thread.getId()); } } }
MyThread 類繼承了 Thread 對象,並重寫(Override)了 run 方法,實現線程裏面的邏輯。main 函數是使用 for 語句,循環建立了 10 個線程,調用 start 方法啓動線程,最後打印當前線程對象的 ID。併發
run 方法和 start 方法的區別是什麼呢?
run 方法就是跑的意思,線程啓動後,會調用 run 方法。
start 方法就是啓動的意思,就是啓動新線程實例。啓動線程後,纔會調線程的 run 方法。socket
執行 main 方法後,控制檯打印以下:ide
MyThread 的線程對象正在執行任務 MyThread 的線程對象 10 MyThread 的線程對象正在執行任務 MyThread 的線程對象 11 MyThread 的線程對象正在執行任務 MyThread 的線程對象 12 MyThread 的線程對象正在執行任務 MyThread 的線程對象 13 MyThread 的線程對象正在執行任務 MyThread 的線程對象 14 MyThread 的線程對象正在執行任務 MyThread 的線程對象 15 MyThread 的線程對象正在執行任務 MyThread 的線程對象 16 MyThread 的線程對象正在執行任務 MyThread 的線程對象 17 MyThread 的線程對象正在執行任務 MyThread 的線程對象 18 MyThread 的線程對象正在執行任務 MyThread 的線程對象 19
可見,線程的 ID 是線程惟一標識符,每一個線程 ID 都是不同的。
start 方法和 run 方法的關係如圖所示:
同理,實現 Runnable 接口類建立線程對象也很簡單,只是不一樣的形式。新建 MyThreadBrother 代碼以下:
/** * 實現 Runnable 接口類建立線程對象 * @author Jeff Lee @ bysocket.com * @since 2018年01月27日21:22:57 */ public class MyThreadBrother implements Runnable { @Override // 能夠省略 public void run() { System.out.println("MyThreadBrother 的線程對象正在執行任務"); } public static void main(String[] args) { for (int i = 0; i < 10; i++) { Thread thread = new Thread(new MyThreadBrother()); thread.start(); System.out.println("MyThreadBrother 的線程對象 " + thread.getId()); } } }
具體代碼:「java-concurrency-core-learning」
https://github.com/JeffLi1993/java-concurrency-core-learning
在運行上面兩個小 demo 後,JVM 執行了 main 函數線程,而後在主線程中執行建立了新的線程。正常狀況下,全部線程執行到運行結束爲止。除非某個線程中調用了 System.exit(1) 則被終止。
在實際開發中,一個請求到響應式是一個線程。但在這個線程中可使用線程池建立新的線程,去執行任務。
新建 MyThreadInfo 類,打印線程對象屬性,代碼以下:
/** * 線程實例對象的屬性值 * @author Jeff Lee @ bysocket.com * @since 2018年01月27日21:24:40 */ public class MyThreadInfo extends Thread { @Override // 能夠省略 public void run() { System.out.println("MyThreadInfo 的線程實例正在執行任務"); // System.exit(1); } public static void main(String[] args) { MyThreadInfo thread = new MyThreadInfo(); thread.start(); System.out.print("MyThreadInfo 的線程對象 \n" + "線程惟一標識符:" + thread.getId() + "\n" + "線程名稱:" + thread.getName() + "\n" + "線程狀態:" + thread.getState() + "\n" + "線程優先級:" + thread.getPriority()); } }
執行代碼打印以下:
MyThreadInfo 的線程實例正在執行任務 MyThreadInfo 的線程對象 線程惟一標識符:10 線程名稱:Thread-0 線程狀態:NEW 線程優先級:5
線程是一個對象,它有惟一標識符 ID、名稱、狀態、優先級等屬性。線程只能修改其優先級和名稱等屬性 ,沒法修改 ID 、狀態。ID 是 JVM 分配的,名字默認也爲 Thread-XX,XX是一組數字。線程初始狀態爲 NEW。
線程優先級的範圍是 1 到 10 ,其中 1 是最低優先級,10 是最高優先級。不推薦改變線程的優先級,若是業務須要,天然能夠修改線程優先級到最高,或者最低。
線程的狀態實現經過 Thread.State 常量類實現,有 6 種線程狀態:new(新建)、runnnable(可運行)、blocked(阻塞)、waiting(等待)、time waiting (定時等待)和 terminated(終止)。狀態轉換圖以下:
線程狀態流程大體以下:
本文介紹了線程與多線程的基礎篇,包括了線程啓動及線程狀態等。下一篇咱們聊下線程的具體操做。包括中斷、終止等
具體代碼:「java-concurrency-core-learning」
https://github.com/JeffLi1993/java-concurrency-core-learning
參考: 《Java併發編程的藝術》 《Java 7 併發編程實戰手冊》 《圖解 Java 多線程設計模式》