Java執行緒面試題(04) Java中程式與執行緒的真實區別

劉近光發表於2017-12-17

簡介

程式設計面試的一個常見問題是執行緒和程式之間有什麼區別?那麼它們之間的主要區別在於一個程式是一個正在執行一些程式碼的程式,而一個執行緒是這個程式中的一個獨立的執行路徑。一個程式可以有多個執行緒來完成獨立的任務,例如一個用於從磁碟讀取資料的執行緒,一個用於處理該資料的執行緒以及另一個用於通過網路傳送該資料的執行緒。這種提高吞吐量和更好地利用CPU能力的技術也被稱為多執行緒技術。從技術上講,執行緒之間最顯著的區別是地址空間和上下文切換。程式中的所有執行緒共享相同的地址空間,但程式有自己的地址空間。類似地,程式之間的上下文切換比執行緒之間的上下文切換有更大開銷。

Thread vs Process

接下來,我們從作業系統的角度,或者程式語言的角度如Java,來分析執行緒和程式之間的差別。

地址空間

來自同一程式的所有執行緒共享建立程式的記憶體空間,另一方面,每個程式都有自己的地址空間。

通訊機制

執行緒可以直接與同一程式的其他執行緒通訊。許多程式語言,如Java提供了執行緒間通訊的工具。它比程式間通訊開銷低得多。

開銷

在後設資料,上下文切換以及CPU和記憶體要求方面,與程式相比,執行緒的開銷更少。

資料段

執行緒可以直接訪問其程式的資料段,單個程式擁有自己的父程式資料段的副本。

建立

新執行緒可以很容易地建立,例如在Java中,您可以通過建立一個Thread類的物件來建立一個新的執行緒並呼叫start()方法,而新程式需要父程式的複製。

行為

對父執行緒的改變,例如守護程式可能會影響程式的其他執行緒的行為,但對父程式的更改不會影響子程式。

存在

一個執行緒不能沒有程式就存在。而且,一個程式至少有一個執行緒來完成這個工作,例如Java程式的主執行緒。

上下文切換

由於來自同一程式的所有執行緒共享相同的地址空間,它們之間的執行緒間通訊和上下文切換比程式之間的程式間通訊和上下文切換快得多。

這是每個程式設計師都應該知道的執行緒和程式之間的一些根本區別。對比完區別,我們來看一下執行緒與程式相似的地方。

相似

執行緒和程式在執行程式碼的意義上有許多相似之處,既有ID,執行時間,優先順序和退出狀態。兩者都可以建立另一個程式和執行緒,但是執行緒對同一程式的其他執行緒有更大程度的控制。程式只能控制子程式。

總結

這些就是關於作業系統中的執行緒和程式之間的區別,它適用於Java或任何其他程式語言。執行緒是輕量級的,在程式中是一個獨立的執行路徑。它們共享相同的程式地址空間,與程式相比,開銷更小。程式是一個單獨的程式,需要自己的地址空間,比執行緒開銷更多。此外,執行緒和程式之間的差異取決於作業系統的實現。例如,Linux中的一個執行緒和一個程式之間的差別比Windows小很多。

相關文章