您好,登錄后才能下訂單哦!
線程是什么?
線程(Thread)是一個對象(Object)。用來干什么?Java 線程(也稱 JVM 線程)是 Java 進程內允許多個同時進行的任務。該進程內并發的任務成為線程(Thread),一個進程里至少一個線程。
Java 程序采用多線程方式來支持大量的并發請求處理,程序如果在多線程方式執行下,其復雜度遠高于單線程串行執行。那么多線程:指的是這個程序(一個進程)運行時產生了不止一個線程。
為啥使用多線程?
聊到多線程,多半會聊并發與并行,咋理解并區分這兩個的區別呢?
Java 創建線程對象有兩種方法:
– 繼承 Thread 類創建線程對象
– 實現 Runnable 接口類創建線程對象
新建 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 方法。
執行 main 方法后,控制臺打印如下:
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
在運行上面兩個小 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(終止)。狀態轉換圖如下:
線程狀態流程大致如下:
本文介紹了線程與多線程的基礎篇,包括了線程啟動及線程狀態等。下一篇我們聊下線程的具體操作。包括中斷、終止等
針對于上面所涉及到的知識點我總結出了有1到5年開發經驗的程序員在面試中涉及到的絕大部分架構面試題及答案做成了文檔和架構視頻資料免費分享給大家(包括Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并發等架構技術資料),希望能幫助到您面試前的復習且找到一個好的工作,也節省大家在網上搜索資料的時間來學習,也可以關注我一下以后會有更多干貨分享。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。