1. 程式人生 > >多執行緒的基本概念

多執行緒的基本概念

隨著計算機系統性能的不斷提升,出於多工的需求和提高資源利用率的原因,需要計算機同時執行多個程式,進一步催生了作業系統中的程序管理,以及多執行緒的概念。

程式

程式是描述計算機所要完成的具有獨立功能的,並且在時間上按嚴格次序前後相繼的計算機操作序列集合,是一個靜態的概念

它體現了程式設計人員要求計算機完成相應功能時所應採取的順序步驟。

程式的順序執行、併發執行和並行執行?

我們以一個例子來講解這個問題,假設一個有三個學生需要輔導作業,幫每個學生輔導完作業是一個任務,輔導作業的過程分為講解思路、學生寫解題過程、老師檢查解題過程。

順序執行:老師甲先幫學生A輔導,輔導完之後再去給B輔導,最後再去給C輔導,效率低下 ,很久才能完成三個任務。

併發執行:老師甲先給學生A去講思路,A聽懂了自己書寫解題過程,而老師在這A書寫解題過程期間直接去給B講思路,講完思路再去給C講思路,讓B自己書寫解題過程。這樣老師就沒有空著,一直在做事情,很快就完成了三個任務。與順序執行不同的是,順序執行,老師講完思路之後學生在寫步驟,這在這期間,老師是完全空著的,沒做事的,所以效率低下。

並行執行:直接讓三個老師甲、乙、丙三個老師“同時”給三個學生輔導作業,也完成的很快。

所以,程式的併發執行是一組邏輯上互相獨立的程式或程式段在執行過程中,其執行時間在客觀上互相重疊,即一個程式段的執行尚未結束,另外一個程式段的執行已經開始的執行方式。

程式的並行執行是指一組程式獨立的、非同步的速度執行。並行是指兩個或者多個程式或程式段在同一個時刻發生;而併發是指兩個或多個程式或程式段在同一時間間隔發生。

併發就是指程式碼邏輯上可以並行,有並行的潛力,但是不一定當前是真的以物理並行的方式執行。併發指的是程式碼的性質,並行指的是物理執行狀態。

上述例子中,老師相當於計算機中的CPU,為學生輔導功課相當於我們的程式,可見使用併發執行的方式可以提高CPU的執行效率,實現並行執行則需要多核CPU。

程序

為了有一個能夠描述程式的執行過程且能用來共享資源的基本單位,引入了程序。

程序是為了提高CPU的執行效率,減少因為程式等待帶來的CPU空轉以及其他計算機軟硬體資源的浪費而提出來的。

程序是為了完成使用者任務所需要的程式的一次執行過程以及為其分配資源的一個基本單位。

程序和程式是兩個既有聯絡又有區別的概念。程序是一個動態概念

,而程式則是一個靜態概念。程式是指令的有序集合,沒有任何的執行的含義。而程序則強調執行過程,它動態地被建立,並被排程執行後消亡。如果把程式比作菜譜,那麼程序就是按照菜譜炒菜的過程。

執行緒

由於建立一個程序需要花費較大的系統開銷和佔用較多的資源,為了減少程序切換和建立的開銷,提高執行效率和節省資源,又引入了執行緒的概念。

執行緒是程序的一部分,程序擁有執行緒和資源。程序是指一段正在執行的程式。而執行緒是指程式的執行過程中,能夠執行程式程式碼的一個最小執行單元。所以,執行緒有時候又被稱為“輕量級的程序”。

一個程序可以擁有多個執行緒,各個執行緒之間共享程式的記憶體空間(程式碼段、資料段和堆空間)及一些程序級資源(例如開啟的檔案),但是各個執行緒擁有自己的棧空間。

在作業系統級別上,程式的執行都是以程序為單位的,為每個程序中通常都會有多個執行緒互不影響地併發執行,這就是多執行緒。

執行緒排程與方法呼叫的區別

程式中的方法呼叫是必須等被呼叫的方法執行完才能繼續執行後面的程式程式碼,而執行緒排程是開闢一條新的執行路徑,與原來的執行緒非同步地執行,原來的執行緒不需要等被排程的執行緒執行完畢。 在這裡插入圖片描述 注意: (1)在Java程式的執行過程中,即使自己沒有建立和排程程序,也會存在多個程序,例如主執行緒和GC(垃圾收集器)程序; (2)main()稱為主執行緒,為程式的入口點,用於執行整個程式。