Java多線程(一)基本概念

轉載請註明出處:http://blog.csdn.net/github_39430101/article/details/77203290

進程和線程

什麼是進程

所謂進程(process)就是一塊包含了某些資源的內存區域。操作系統利用進程把它的工作劃分爲一些功能單元。進程中所包含的一個或多個執行單元稱爲線程(thread)。進程還擁有一個私有的虛擬地址空間,該空間僅能被它所包含的線程訪問。線程只能歸屬於一個進程並且它只能訪問該進程所擁有的資源。當操作系統創建一個進程後,該進程會自動申請一個名爲主線程或首要線程的線程。操作系統中有若干個線程在”同時”運行。通常,操作系統上運行的每一個應用程序都運行在一個進程中,例如:QQ,微信等等。

什麼是線程

一個線程就是進程的一個順序執行流。同類的多個線程共享一塊內存空間和一組系統資源,線程本身有一個供程序執行時的堆棧。線程在切換時負荷小,因此,線程也被稱爲輕負荷進程。一個進程中可以包含多個線程。

進程與線程的區別

一個進程至少有一個線程。線程的劃分尺度小於進程,使得多線程程序的併發性高。另外,進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程序的運行效率。線程在執行過程中與進程的區別在於每個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口。但是線程不能夠獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。從邏輯角度來看,多線程的意義在於一個應用程序中,有多個執行部分可以同時執行。但操作系統並沒有將多個線程看做多個獨立的應用來實現進程的調度和管理以及資源分配。

進程 線程
定義 進程是程序運行的一個實體(包括:程序段、相關的數據段、進程控制塊PCB)的運行過程,是系統進行資源分配和調度的一個獨立單位 線程是進程運行和執行的最小調度單位
系統開銷創建、撤銷、切換開銷大,資源要重新分配和收回。相對於進程僅保存少量寄存器內容,開銷小,
擁有資產資源擁有的基本單位相對於進程來說基本上不擁有資源,但會佔CPU
地址空間系統賦予的獨立的內存地址空間線程只由相關堆棧寄存器和線程控制表TCB組成,寄存器可被用來存儲線程內的局部變量
安全性進程之間相對比較獨立,彼此不會互相影響線程共享同一個進程下面的資源,可以互相通信和互相影響

線程使用的場合

線程通常用於在一個程序中需要同時完成多個任務的情況。我們可以將每個任務定義爲一個線程,使他們得以一同工作。
例如我們在玩某個遊戲時,這個遊戲由操作系統運行,所以其運行在一個獨立的進程中,而在遊戲中我們會聽到某些背景音樂,某個角色在移動,出現某些絢麗的動畫效果等,這些在遊戲中都是同時發生的,但實際上,播放音樂是在一個線程中獨立完成的,移動某個角色,播放某些特效也都是在獨立的線程中完成的。這些事情我們無法在單一線程中完成。也可以用於在單一線程中可以完成,但是使用多線程可以更快的情況。比如下載文件。比如迅雷,我們嚐嚐會開到它會打開很多個節點來同時下載一個文件。

併發原理

多個線程或進程”同時”運行只是我們感官上的一種表現。事實上進程和線程是併發運行的,OS的線程調度機制將時間劃分爲很多時間片段(時間片),儘可能均勻分配給正在運行的程序,獲取CPU時間片的線程或進程得以被執行,其他則等待。而CPU則在這些進程或線程上來回切換運行。微觀上所有進程和線程是走走停停的,宏觀上都在運行,這種都運行的現象叫併發,但是不是絕對意義上的“同時發生。

線程狀態

這裏寫圖片描述

圖上主要包括五種基本狀態

  • 新建狀態(new):當線程對象創建後,即進入了新建狀態,如:Thread t = new MyThread();
  • 就緒狀態(Runnable):當調用線程對象的start()方法線程即進入就緒狀態。處於就緒狀態的線程,只是說明此線程已經做好了等待CPU調度分配時間片的準備,並不是說執行了start()方法此線程就立即會執行。
  • 運行狀態(Running):當CPU開始調度處於就緒狀態的線程時,此線程纔開始真正執行,即進入到運行狀態。
  • 阻塞狀態(Blocked):處於運行狀態中的線程由於某種原因,暫時放棄對CPU的使用權,停止執行,此時進入阻塞狀態,直到其進入就緒狀態纔有機會再次被CPU調用。阻塞狀態可分爲三種:
    1.等待阻塞:運行狀態中的線程執行wait()方法,使本線程進入到等待阻塞狀態
    2.同步阻塞:線程在獲取synchronized同步鎖(鎖被其他線程所佔用),它會進入同步阻塞狀態
    3.其他阻塞:通過調用線程的sleep()或join()或發出了IO請求時,線程會進入到阻塞狀態。當sleep()狀態超時、join()等待線程終止或者超時、後者IO處理完畢時,線程重新轉入就緒狀態。
  • 死亡狀態(Dead):線程執行完了或者因爲異常退出了run()方法,該線程結束生命週期。
發佈了35 篇原創文章 · 獲贊 30 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章