《Java多線程編程核心技術(第2版)》 —1 Java多線程技能
第1章
Java多線程技能
作為本書的第1章,重點是讓讀者快速進入Java多線程的學習,所以本章主要介紹Thread類的核心方法。Thread類的核心方法較多,讀者應該著重掌握如下技術點:
線程的啟動;
如何使線程暫停;
如何使線程停止;
線程的優先級;
線程安全相關的問題。
以上內容也是本章學習的重點與思路,掌握這些內容是進入Java多線程學習的必經之路。
1.1 進程和多線程概述
本書主要介紹在Java語言中使用的多線程技術,但講到多線程技術時不得不提及“進程”這個概念,“百度百科”對“進程”的解釋如圖1-1所示。
圖1-1 進程的定義
初看這段文字十分抽象,難以理解,那么再來看如圖1-2所示的內容。
圖1-2 Windows 7系統中的進程列表
難道一個正在操作系統中運行的exe程序可以理解成一個“進程”?沒錯!
通過查看“Windows任務管理器”窗口中的列表,完全可以將運行在內存中的exe文件理解成進程—進程是受操作系統管理的基本運行單元。
程序是指令序列,這些指令可以讓CPU完成指定的任務。*.java程序經編譯后形成*.class文件,在Windows中啟動一個JVM虛擬機相當于創建了一個進程,在虛擬機中加載class文件并運行,在class文件中通過執行創建新線程的代碼來執行具體的任務。創建測試用的代碼如下:
public class Test1 {
public static void main(String[] args) {
try {
Thread.sleep(Integer.MAX_VALUE);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
在沒有運行這個類之前,任務管理器中以“j”開頭的進程列表如圖1-3所示。
圖1-3 任務管理器中以“j”開頭的進程
Test1類重復運行3次后的進程列表如圖1-4所示。可以看到,在任務管理器中創建了3個javaw.exe進程,說明每執行一次main()方法就創建一個進程,其本質上就是JVM虛擬機進程。
圖1-4 創建了3個javaw.exe進程
那什么是線程呢?線程可以理解為在進程中獨立運行的子任務,例如,QQ.exe運行時,很多的子任務也在同時運行,如好友視頻線程、下載文件線程、傳輸數據線程、發送表情線程等,這些不同的任務或者說功能都可以同時運行,其中每一項任務完全可以理解成是“線程”在工作,傳文件、聽音樂、發送圖片表情等這些功能都有對應的線程在后臺默默地運行。
進程負責向操作系統申請資源。在一個進程中,多個線程可以共享進程中相同的內存或文件資源。
使用多線程有什么優點呢?其實如果有使用“多任務操作系統”的經驗,如Windows系列,大家應該都有這樣的體會:使用多任務操作系統Windows,可以大幅利用CPU的空閑時間來處理其他任務,例如,可以一邊讓操作系統處理正在用打印機打印的數據,一邊使用Word編輯文檔。CPU在這些任務中不停地進行切換,由于切換的速度非常快,給使用者的感受是這些任務在同時運行,所以使用多線程技術可以在同一時間內執行更多不同的任務。
為了更加有效地理解多線程的優勢,下面先來看如圖1-5所示的單任務運行環境。
在圖1-5中,任務1和任務2是兩個完全獨立、不相關的任務。任務1在等待遠程服務器返回數據,以便進行后期處理,這時CPU一直呈等待狀態,一直在“空運行”。任務2在10s之后被運行,雖然執行完任務2所用時間非常短,僅僅是1s,但也必須等任務1運行結束后才可以運行任務2,本程序運行在單任務環境中,所以任務2有非常長的等待時間,系統運行效率大幅降低。單任務的特點就是排隊執行,即同步,就像在cmd中輸入一條命令后,必須等待這條命令執行完才可以執行下一條命令。在同一時間只能執行一個任務,CPU利用率大幅降低,這就是單任務運行環境的缺點。
多任務運行環境如圖1-6所示。
在圖1-6中,CPU完全可以在任務1和任務2之間來回切換,使任務2不必等到10s之后再運行,系統和CPU的運行效率大大提升,這就是為什么要使用多線程技術、為什么要學習多線程。多任務的特點是在同一時間可以執行多個任務,這也是多線程技術的優點。使用多線程也就是在使用異步。
在通常情況下,單任務和多任務的實現與操作系統有關。例如,在一臺計算機上使用同一個CPU,安裝DOS磁盤操作系統只能實現單任務運行環境,而安裝Windows操作系統則可以實現多任務運行環境。
在什么場景下使用多線程技術?筆者總結了兩點。
1)阻塞。一旦系統中出現了阻塞現象,則可以根據實際情況來使用多線程技術提高運行效率。
2)依賴。業務分為兩個執行過程,分別是A和B。當A業務發生阻塞情況時,B業務的執行不依賴A業務的執行結果,這時可以使用多線程技術來提高運行效率;如果B業務的執行依賴A業務的執行結果,則可以不使用多線程技術,按順序進行業務的執行。
在實際的開發應用中,不要為了使用多線程而使用多線程,要根據實際場景決定。
多線程是異步的,所以千萬不要把Eclipse代碼的順序當作線程執行的順序,線程被調用的時機是隨機的。
軟件開發 Java Java
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。