多執行緒程式設計 基礎篇 (一)
基礎篇 (一)
[寫在前面]
隨著計算機技術的發展,程式設計模型也越來越複雜多樣化.但多執行緒程式設計模型是目前計算機
系統架構的最終模型.隨著CPU主頻的不斷攀升,X86架構的硬體已經成為瓶,在這種架構的CPU主頻最
高為4G.事實上目前3.6G主頻的CPU已經接近了頂峰.
如果不能從根本上更新當前CPU的架構(在很長一段時間內還不太可能),那麼繼續提高CPU
效能的方法就是超執行緒CPU模式.
那麼,作業系統,應用程式要發揮CPU的最大效能,就是要改變到以多執行緒程式設計模型為主的並
行處理系統和併發式應用程式.
所以,掌握多執行緒程式設計模型,不僅是目前提高應用效能的手段,更是下一代程式設計模型的核心
思想.
多執行緒程式設計的目的,就是"最大限度地利用CPU資源",當某一執行緒的處理不需要佔用CPU而只
和I/O,OEMBIOS等資源打交道時,讓需要佔用CPU資源的其它執行緒有機會獲得CPU資源.從根本上說,這就是多
執行緒程式設計的最終目的.
[第一需要弄清的問題]
如同程式和程序的區別,要掌握多執行緒程式設計,第一要弄清的問題是:執行緒物件和執行緒的區別.
執行緒物件是可以產生執行緒的物件.比如在java平臺中Thread物件,Runnable物件.
執行緒,是指正在執行的一個指令序列.在java平臺上是指從一個執行緒物件的start()開始.
執行run方法體中的那一段相對獨立的過程.
鑑於作者的水平,無法用更確切的詞彙來描述它們的定義.但這兩個有本質區別的概念請初
學者細細體會,隨著介紹的深入和例程分析的增加,就會慢慢明白它們所代表的真實含義.
天下難事必始於易,天下大事必始於細.
讓我們先從最簡單的"單執行緒"來入手.(1)帶引號說明只是相對而言的單執行緒.(2)基於java
class BeginClass{
public static void main(String[] args){
for(int i=0;i<100;i++)
System.out.println("Hello,World!");
}
}
如果我們成功編譯了該java檔案,然後在命令列上敲入:
java BeginClass
現在發生了什麼呢?每一個java程式設計師,從他開始學習java的第一分鐘裡都會接觸到這個問
題,但是,你知道它到底發生發什麼?
JVM程序被啟動,在同一個JVM程序中,有且只有一個程序,就是它自己.然後在這個JVM環境中,
所有程式的執行都是以執行緒來執行.JVM最先會產生一個主執行緒,由它來執行指定程式的入口點.在這個
程式中,就是主執行緒從main方法開始執行.當main方法結束後,主執行緒執行完成.JVM程序也隨之退出.
我們看到的是一個主執行緒在執行main方法,這樣的只有一個執行緒執行程式邏輯的流程我們稱
之為單執行緒.這是JVM提供給我們的單執行緒環境,事實上,JVM底層還至少有垃圾回收這樣的後臺執行緒以
及其它非java執行緒,但這些執行緒結我們而言不可訪問,我們只認為它是單執行緒的.
主執行緒是JVM自己啟動的,在這裡它不是從執行緒物件產生的.在這個執行緒中,它運行了main方法
這個指令序列.理解它,但它沒有更多可以研究的內容.
[接觸多執行緒]
class MyThread extends Thread{
public void run(){
System.out.println("Thread say:Hello,World!");
}
}
public class MoreThreads{
public static void main(String[] args){
new MyThread();
new MyThread().start();
System.out.println("Main say:Hello,World");
}
}
執行這個程式,main方法第一行產生了一個執行緒物件,但並沒有執行緒啟動.
main方法第二行產生了一個執行緒物件,並啟動了一個執行緒.
main方法第三行,產生並啟動一個執行緒後,主執行緒自己也繼續執行其它語句.
我們先不研究Thread物件的具體內容,稍微來回想一下上面的兩個概念,執行緒物件和執行緒.
在JAVA中,執行緒物件是JVM產生的一個普通的Object子類.
而執行緒是CPU分配給這個物件的一個執行過程.我們說的這個執行緒在幹什麼,不是說一個線
程物件在幹什麼,而是這個執行過程在幹什麼.如果一時想不明白,不要急,但你要記得它們不是一回
事就行了.
累了吧?為不麼不繼續了?
基於這種風格來介紹多執行緒,並不是每個人都喜歡和接受的,如果你不喜歡,正好不浪費你的
時間了,而如果你接受的話,那就看下一節吧.