在講述多線程之前有必要先弄清楚進程與線程的區別和關係。
進程就是電腦中正在執行的程式(即處於活動狀態的程式),且每一個進程都有自己獨立一塊記憶體空間和一組系統資源。這些程式使用的記憶體空間和資源都是獨立的,並且每個程式也是為了各自的任務而運行,互不干擾。
在進程的基礎上提出了線程的概念,線程使得在一個進程中同時處理多個任務成為可能。線程可以看作是進程的進一步細分,也就是把進程完成的任務劃分成一個個更小的子任務,每一個子任務就是一個線程,然後去執行這些細分的線程。
線程是基於進程的一個基本運行單位,線程中同樣包括一個記憶體進入點地址、一個出口點地址及能夠順序執行的代碼序列。
線程與進程的重要區別在於線程不能夠單獨執行,它必須運行在處於活動狀態的進程中。線程是在進程範圍內活動的一系列指令流,所以線程也被稱為輕型進程。
1.多線程簡介
多線程機制允許在程式中“並行”執行多個指令流,每個指令流被稱作一個線程,且彼此間的執行相互獨立。
在單CPU電腦系統中,系統把CPU的時間片按照調度演算法分配給各個線程,因此各個線程實際上是分時執行的。在多CPU電腦系統中,同一個程式的不同線程可以分配到不同的CPU上去執行,多個線程的執行是並發的。
在多線程中,各個線程的控制流程彼此獨立,所以多線程和傳統的單線程在程式設計上最大的區別是,各個線程之間的代碼是亂序執行的。因此,在進行多線程程式設計時,往往會增加一些線程狀態控制的語句以使線程的運行滿足程式的要求。
2.多線程機制
Java引入了虛擬處理器技術,將線程支援與語言運行環境結合在一起,不管在任何系統下,Java語言都提供了多任務並發執行的能力,對多線程的綜合支援也是Java語言的一個重要特色。
在Java中,內建了Thread類來實現多線程。一個線程是由三部分組成的:
(1)虛擬處理機,封裝在java.lang.Thread類中,它控制著整個線程的運行,提供對多線程的支援。
(2)執行的程式碼,傳遞給Thread類,由Thread類控制順序執行。
(3)程式所處理的資料,傳遞給Thread類。
需要注意的是,程式碼可以根據需要被多個線程所共用,它們是和資料相互獨立的,兩個線程在執行同一個類的執行個體代碼時可以共用同一段代碼。同樣的,資料也可以根據需要被多個線程所共用,與代碼相互獨立,兩個線程在訪問一個對象時也可以共用相同的資料。
3.線程類
在Java中,Thread類是負責向其他類提供線程支援的最主要的類。Thread類在java.lang包中定義,其構造方法有以下一些:
Thread();
Thread(Runnable target);
Thread(Runnable target, String name);
Thread(String name);
Thread(ThreadGroup group, String name);
Thread(ThreadGroup group, Runnable target);
Thread(ThreadGroup group, Runnable target, String name);
Thread(ThreadGroup group, Runnable target, String name, long stackSize);
其中,參數group指明該線程所屬的線程組;參數target是指實際執行線程體的目標對象,必須實現Runnable介面;參數name為線程名;參數stackSize為指定的堆棧大小。
除此之外,Thread類的常用方法有以下一些:
(1)public static void yield(); //暫停當前執行的線程,允許其他線程執行
(2)public static void sleep(long millis); //使當前執行的線程睡眠指定的時間
(3)public void start(); //使線程由建立狀態變成可運行狀態
(4)public void run(); //運行線程
(5)public final void stop(); //停止當前線程
(6)public final void wait(); //導致當前的線程等待,直到被喚醒或超過指定的等待時間
(7)public final boolean isAlive(); //判斷線程是否處於活動狀態
(8)public final void setPriority(int new); //設定線程的優先順序
(9)public static Thread currenthread(); //返回當前執行線程對象的引用
(10)public final void notify(); //喚醒一個等待中的線程
(11)public final void notifyAll(); //喚醒所有處於等待中線程
(待續......)