線程的概念
線程:“程序中一個單一的順序控制流程”,這種官方的解釋可能不太容易理解,換句話說線程其實是程序的一條執行的路線。而我們所說的多線程,則是程序內部有多條執行路線同時執行的一種機制。
在我們認識多線程之前,我們所寫的代碼只能是一行行代碼的去順序執行(即使是循環也不可能同時執行兩行代碼),而有了多線程機制則不同了,我們可以控制CPU“同時”執行兩個及以上的功能塊代碼,就彷彿一條水流多了幾條分支,這幾條水流同時在各自的區域內流動。這裏的同時之所以加上引號,是因爲一個CPU某個時刻是隻能執行一個線程的。
(這裏說同時執行兩個及以上,是因爲CPU的運行速度是非常快的,它可以在多個線程間進行切換,對用戶來說就彷彿值在同時執行着多條線程,同時也存在另外一種情況,一臺計算機配有多個CPU,一個CPU處理一個線程,多個CPU同時可處理多條線程,這樣對用戶來說也是計算機在同時進行這多條線程。)
進程的概念
在初步認識了線程的概念後,我們有必要了解一下它的“長輩”——進程。進程代表着計算機中程序關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操作系統結構的基礎。在當代面向線程設計的計算機結構中,進程是線程的容器。
打開任務管理器,我們可以看到有一個名叫“進程”的選項卡,在它下面有我們計算機正在運行着的N多個程序,因此可以說進程是運行程序過程的抽象,它可以動態的創建,也可以動態的消亡。進程與線程的主要區別和聯繫是:進程可以申請和擁有獨立的資源,而進程內的線程可以共享這些資源。
java中的線程創建
java中使用Thread類來表示線程,要新建一個線程,便是將Thread實例化一個對象,此時創建出的線程並沒有得到真正執行,我們需要調用Thread對象的start對象才能真正啓動其線程:
方式一:
//實例化繼承Thread的匿名類對象
Thread thread = new Thread(){
//重寫run方法,線程啓動後執行的代碼片段
@Override
public void run() {
while(true){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("1:" + Thread.currentThread().getName());
}
}
};
thread.start();
方式二:
Thread thread2 = new Thread(new Runnable(){
@Override
public void run() {
while(true){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("2:" + Thread.currentThread().getName());
}
}
});
thread2.start();
從兩小段程序中我們可以看到,調用Thread的start()方法,纔開始執行線程的功能段,也就是run方法內的代碼,實際上在調用了start方法後,線程是處於就緒狀態,也就是等待操作系統進行調度的狀態,當CPU真正處理這個線程時纔算是真正的運行狀態。
在線程運行過程中可能出現資源不足或條件不符合運行要求時,線程將進入阻塞狀態,知道條件或資源滿足時才繼續執行。
線程的幾種狀態及其相互間轉換如下圖:
總結
本篇文章介紹了線程的整體概念以及在java中如何創建線程,只有清楚自己程序內部執行流程,纔有可能控制並明確系統的脈絡。