多線程Multi-Thread 基礎
線程概念
線程就是程序中單獨順序的流控制。
線程本身不能運行,它只能用於程序中。
說明:線程是程序內的順序控制流,只能使用分配給程序的資源和環境。
進程
進程:執行中的程序。
程序是靜態的概念,進程是動態的概念。
一個進程可以包含一個或多個線程。
一個進程至少要包含一個線程。
線程與進程的區別
多個進程的內部數據和狀態都是完全獨立的,而多線程是共享一塊內存空間和一組系統資源,有可能互相影響。
線程本身的數據通常只有寄存器數據,以及一個程序執行時使用的堆棧,所以線程的切換負擔比進程切換的負擔要小。
多線程程序比多進程程序需要更少的管理費用。
進程是重量級的任務,需要分配給它們獨立的地址空間,進程間通信是昂貴和受限的,進程間的轉換也是很需要花費的。
另一方面,線程是輕量級的選手,它們共享相同的地址空間並且共同分享同一個進程,線程間的通信是便宜的,線程間的轉換也是低成本的。
單線程
單個程序中只有一個線程就是單線程。
當程序啟動運行時,就自動產生一個線程,主方法main就在這個主線程上運行。我們的程序都是由線程來執行的。
多線程
多線程指在單個程序中可以同時運行多個不同的線程執行不同的任務。
多線程編程的目的,就是“最大限度地利用CPU資源”,當某一線程的處理不需要占用CPU而只和IO等資源打交道時,讓需要占用CPU的其他線程有機會獲得CPU資源。從根本上說,這就是多線程編程的最終目的。
一個程序實現多個代碼同時交替運行就需要產生多個線程。
CPU隨機地抽出時間,讓我們的程序一會做這件事情,一會做另外的事情。
從宏觀角度來看,多個線程在同時執行(宏觀並行),但是微觀上來看,處理器的個數決定了某一個時刻可以同時運行的最大線程數,如單核CPU某一時刻只能有一個線程在執行(微觀串行),雙核的CPU在某一個時刻,最多可以運行兩個線程,可以做到微觀並行。
Java中的多線程
同其他大多數編程語言不同,Java內置支持多線程編程(Multithreaded Programming)。
多線程程序包含兩條或兩條以上並發運行的部分,程序中每個這樣的部分都叫做一個線程(Thread)。每個線程都有獨立的執行路徑,因此多線程是多任務處理的一種特殊形式。
多任務處理被所有的現代操作系統所支持。然而,多任務處理有兩種截然不同的類型:基於進程的和基於線程的。
1.基於進程的多任務處理是更熟悉的形式。進程(process)本質上是一個執行的程序。因此基於進程的多任務處理的特點是允許你的計算機同時運行兩個或更多的程序。
舉例來說,基於進程的多任務處理使你在運用文本編輯器的時候可以同時運行Java編譯器。
在基於進程的多任務處理中,程序是調度程序所分派的最小代碼單位。
2.而在基於線程(thread-based)的多任務處理環境中,線程是最小的執行單位。
這意味着一個程序可以同時執行兩個或者多個任務的功能。
例如,一個文本編輯器可以在打印的同時格式化文本。
Java線程模型
Java多線程的優點就在於取消了主循環/輪詢機制。一個線程可以暫停而不影響程序的其他部分。
多線程允許活的循環在每一幀間隙中沉睡一秒而不暫停整個系統。
線程組
所有線程都隸屬於一個線程組。那可以是一個默認線程組,也可以是一個創建線程時明確指定的組。
說明:
在創建之初,線程被限制到一個組里,而且不能改變到一個不同的組。
若創建多個線程而不指定一個組,它們就會與創建它的線程屬於同一個組。
參考資料
聖思園張龍老師Java SE系列視頻教程。
