張玉蓉 藍雯飛
摘要本文以Java的多線程為研究對象,闡述了Java線程的同步機制、模型及調度,討論了Java 在語言級對多線程的支持,并對Java環境下多線程程序的開發及應用進行了較深入的探討。
關鍵詞進程線程同步Java
1 引言
Java是一種純面向對象的編程語言, 它除了具有可移植性、安全性、平臺無關性等優點外,其內置的多線程機制是傳統的C和C++所不具有的,Java虛擬機的很多任務都依賴線程調度。如能很好地利用線程,可以大大簡化應用程序設計,本文詳細探討了Java的多線程技術。
2 線程的相關概念
2.1線程與進程的概念
進程(Process)是應用程序在內存環境中基本的執行單元。在Java中,進程是有不同的地址空間且處在可執行狀態中的應用程序, 從用戶角度來看,進程是應用程序的一個執行過程。線程(Thread)是指進程中某個單一的順序控制流程。新興的操作系統,如Mac、Windows NT等大多采用多線程的概念,把線程視為基本執行單位。
2.2線程與進程的區別
線程與進程一樣,都有其執行的開始、順序和結束, 執行期間的任一時刻都有一個執行點。進程與線程的重要區別之一在于線程不能夠單獨執行,它必須運行在處于活動狀態的應用程序進程中,因此可以定義線程是程序內部的具有并發性的順序代碼流。每個進程都可以同時有執行不同任務的多個線程。多線程的意義在于一個應用程序的多個邏輯單元可以并發地執行,但并不意味著多個用戶進程在執行,操作系統也不把每個線程作為獨立的進程來分配獨立的系統資源。

線程與進程區別之二在于二者的通信不同。進程可以創建子進程,父子進程擁有不同的可執行代碼和數據內存空間,因此進程間通信復雜,可能需要管道、消息隊列、共享內存或信號處理來保證進程間的通信,不僅費時而且有限。而一個進程中的各線程因為共享地址空間, 所以它們之間的通信是非常簡單而有效的, 線程僅是過程調用,它們彼此獨立執行,擁有獨立的執行堆棧和程序執行上下文。
2.3線程的生命周期及其狀態轉換
在Java語言中, 線程自創建后就處于其生命周期中, 程序可以對線程進行各種控制操作,包括啟動、終止、掛起、恢復等, 相應地, 線程在不同的生命階段因為對其施加的操作不同就有不同的狀態。圖1給出了線程可能的各種狀態以及從一個狀態轉化為另一種狀態時需要進行的控制操作。Java線程在其生命周期中,共有五種線程狀態, 如圖1所示。
(1) Newborn是線程已被創建但尚未執行的狀態。此時線程對象已被分配內存空間,其私有數據已被初始化,線程對象可通過start( ) 方法調度,或者利用stop( )方法取消,新創建的線程一旦被調度, 就將切換到Runnable狀態。
(2) Runnable是線程的就緒狀態,表示線程正等待處理器資源,隨時等待處理機調度執行。處于就緒狀態的線程事實上已被調度,線程依據自身優先級進入等待隊列,等待線程調度系統給分配CPU時間。處于就緒狀態的線程何時可真正執行, 取決于線程優先級以及隊列的當前狀況。


