Java 多线程(一) 基础知识与概念
多線程Multi-Thread 基礎(chǔ)
?
線程概念
線程就是程序中單獨(dú)順序的流控制。
線程本身不能運(yùn)行,它只能用于程序中。
說明:線程是程序內(nèi)的順序控制流,只能使用分配給程序的資源和環(huán)境。
?
進(jìn)程
進(jìn)程:執(zhí)行中的程序。
程序是靜態(tài)的概念,進(jìn)程是動態(tài)的概念。
一個進(jìn)程可以包含一個或多個線程。
一個進(jìn)程至少要包含一個線程。
?
線程與進(jìn)程的區(qū)別
多個進(jìn)程的內(nèi)部數(shù)據(jù)和狀態(tài)都是完全獨(dú)立的,而多線程是共享一塊內(nèi)存空間和一組系統(tǒng)資源,有可能互相影響。
線程本身的數(shù)據(jù)通常只有寄存器數(shù)據(jù),以及一個程序執(zhí)行時使用的堆棧,所以線程的切換負(fù)擔(dān)比進(jìn)程切換的負(fù)擔(dān)要小。
多線程程序比多進(jìn)程程序需要更少的管理費(fèi)用。
進(jìn)程是重量級的任務(wù),需要分配給它們獨(dú)立的地址空間,進(jìn)程間通信是昂貴和受限的,進(jìn)程間的轉(zhuǎn)換也是很需要花費(fèi)的。
另一方面,線程是輕量級的選手,它們共享相同的地址空間并且共同分享同一個進(jìn)程,線程間的通信是便宜的,線程間的轉(zhuǎn)換也是低成本的。
?
單線程
單個程序中只有一個線程就是單線程。
當(dāng)程序啟動運(yùn)行時,就自動產(chǎn)生一個線程,主方法main就在這個主線程上運(yùn)行。我們的程序都是由線程來執(zhí)行的。
?
多線程
多線程指在單個程序中可以同時運(yùn)行多個不同的線程執(zhí)行不同的任務(wù)。
多線程編程的目的,就是“最大限度地利用CPU資源”,當(dāng)某一線程的處理不需要占用CPU而只和IO等資源打交道時,讓需要占用CPU的其他線程有機(jī)會獲得CPU資源。從根本上說,這就是多線程編程的最終目的。
一個程序?qū)崿F(xiàn)多個代碼同時交替運(yùn)行就需要產(chǎn)生多個線程。
CPU隨機(jī)地抽出時間,讓我們的程序一會做這件事情,一會做另外的事情。
從宏觀角度來看,多個線程在同時執(zhí)行(宏觀并行),但是微觀上來看,處理器的個數(shù)決定了某一個時刻可以同時運(yùn)行的最大線程數(shù),如單核CPU某一時刻只能有一個線程在執(zhí)行(微觀串行),雙核的CPU在某一個時刻,最多可以運(yùn)行兩個線程,可以做到微觀并行。
?
Java中的多線程
同其他大多數(shù)編程語言不同,Java內(nèi)置支持多線程編程(Multithreaded Programming)。
多線程程序包含兩條或兩條以上并發(fā)運(yùn)行的部分,程序中每個這樣的部分都叫做一個線程(Thread)。每個線程都有獨(dú)立的執(zhí)行路徑,因此多線程是多任務(wù)處理的一種特殊形式。
多任務(wù)處理被所有的現(xiàn)代操作系統(tǒng)所支持。然而,多任務(wù)處理有兩種截然不同的類型:基于進(jìn)程的和基于線程的。
1.基于進(jìn)程的多任務(wù)處理是更熟悉的形式。進(jìn)程(process)本質(zhì)上是一個執(zhí)行的程序。因此基于進(jìn)程的多任務(wù)處理的特點(diǎn)是允許你的計(jì)算機(jī)同時運(yùn)行兩個或更多的程序。
舉例來說,基于進(jìn)程的多任務(wù)處理使你在運(yùn)用文本編輯器的時候可以同時運(yùn)行Java編譯器。
在基于進(jìn)程的多任務(wù)處理中,程序是調(diào)度程序所分派的最小代碼單位。
2.而在基于線程(thread-based)的多任務(wù)處理環(huán)境中,線程是最小的執(zhí)行單位。
這意味著一個程序可以同時執(zhí)行兩個或者多個任務(wù)的功能。
例如,一個文本編輯器可以在打印的同時格式化文本。
?
Java線程模型
Java多線程的優(yōu)點(diǎn)就在于取消了主循環(huán)/輪詢機(jī)制。一個線程可以暫停而不影響程序的其他部分。
多線程允許活的循環(huán)在每一幀間隙中沉睡一秒而不暫停整個系統(tǒng)。
?
線程組
所有線程都隸屬于一個線程組。那可以是一個默認(rèn)線程組,也可以是一個創(chuàng)建線程時明確指定的組。
說明:
在創(chuàng)建之初,線程被限制到一個組里,而且不能改變到一個不同的組。
若創(chuàng)建多個線程而不指定一個組,它們就會與創(chuàng)建它的線程屬于同一個組。
?
參考資料
圣思園張龍老師Java SE系列視頻教程。
轉(zhuǎn)載于:https://www.cnblogs.com/xuyatao/p/6896335.html
總結(jié)
以上是生活随笔為你收集整理的Java 多线程(一) 基础知识与概念的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php RabbitMQ使用
- 下一篇: Java核心类库-IO-打印流(Prin