多線程系列一——何爲線程與java中線程的創建

線程的概念

        線程:“程序中一個單一的順序控制流程”,這種官方的解釋可能不太容易理解,換句話說線程其實是程序的一條執行的路線。而我們所說的多線程,則是程序內部有多條執行路線同時執行的一種機制。

        在我們認識多線程之前,我們所寫的代碼只能是一行行代碼的去順序執行(即使是循環也不可能同時執行兩行代碼),而有了多線程機制則不同了,我們可以控制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中如何創建線程,只有清楚自己程序內部執行流程,纔有可能控制並明確系統的脈絡。


發佈了152 篇原創文章 · 獲贊 222 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章