在作業系統中,一個獨立的正在運作的程式稱為程序,通常一個程式又被分為稱作任務的小塊,任務又可以進一步分為稱作線程的更小的塊。如果一個程式多于一個線程同時執行,就可以稱為多線程并行。
一個線程被定義為一個單一的連續控制流,線程也可以成為執行環境或者輕量級程式。當一個程式發起之後,會首先生成一個預設的線程,這個線程被稱作主線程,就是由main方法引導進入的線程,main方法調用的方法結構會在這個主線程中順序執行。如果線上程中建立并啟動的線程稱為從線程。從線程也有自己的入口方法,這是由開發者自己定義的。
多線程程式比多程序程式需要更少的管理成本。程序是重量級的任務,需要為他們配置設定自己獨立的記憶體資源。程序間的通信是昂貴而受限的,由于每個程序記憶體資源是獨立的,是以程序間的轉換也需要很大的系統開銷。線程則是輕量級的任務,它們隻在單個程序作用域活動,可以共享相同的位址空間,共同處理一個程序。線程間的通信和轉換是低成本的,因為它們可以通路和使用同一個記憶體空間。
當java程式使用多程序任務處理程式時,多程序程式是不受jvm控制的,即jvm不能操縱程序暫停或者繼續。而多線程則是受jvm控制,這正是由于java支援多線程操作。使用多線程的優勢在于可以編寫出非常高效的程式。程式運作中除了cpu外,還要使用鍵盤、硬碟等外部輸入儲存設備,還經常使用網絡裝置進行資料傳輸。這些裝置的讀寫速度都比cpu執行速度慢很多,是以程式經常等待接收或者發送資料。使用多線程可以充分利用cpu資源,當一個線程因為讀寫需要等待時,另外一個線程就可以運作了。
在java中,線程有如下幾種狀态:
1. 建立(new):當建立線程後處于該狀态
2. 就緒(ready):建立線程後調用start()方法後,線程處于就緒狀态
3. 運作(running):當處于就緒的線程得到cpu資源後将處于運作狀态
4. 挂起(suspend):程式可以在運作中将線程暫停挂起
5. 阻塞(block):運作中的線程如果遇到讀寫或者其他堵塞條件,将轉入阻塞狀态
6. 恢複(resume):當處于阻塞狀态的線程如果獲得資源時或者阻塞事件結束則線程恢複執行
7. 終止(terminate):當線程遇到異常或者執行結束則終止