參考http://www.cnblogs.com/dolphin0520/p/3920357.html,《深入理解java虛擬機》
對於單核CPU來說(對於多核CPU,此處就理解為一個核),CPU在一個時刻只能運行一個線程,當在運行一個線程的過程中轉去運行另外一個線程,
這個叫做線程上下文切換(對於進程也是類似)。
由於可能當前線程的任務並沒有執行完畢,所以在切換時需要保存線程的運行狀態,以便下次重新切換回來時能夠繼續切換之前的狀態運行。舉個簡單的例子:比如一個線程A正在讀取一個文件的內容,正讀到文件的一半,此時需要暫停線程A,轉去執行線程B,當再次切換回來執行線程A的時候,我們不希望線程A又從文件的開頭來讀取。
在理解這個之前,要理解程序計數器的作用(以下摘抄來自《深入理解java虛擬機》):
程序計數器是一塊較小的內存空間,它可以看作是當前線程所執行字節碼的行號指示器。在虛擬機的概念模型里(僅是概念模型,各種虛擬機可能會通過一些更高效的方式去實現),字節解釋器工作時就是通過改變這個計數器的值來選取下一條需要執行的字節碼指令。且由於java虛擬機的多線程是通過線程輪流切換並分配器執行時間的方式來實現的,在任何一個確定的時刻,一個處理器(對於多核處理器是一個內核)都只會執行一條線程中的指令,因為為了線程切換后能恢復到正確的執行位置,每條線程都需要有一個獨立的程序計數器,各條線程之間計數器互不影響,我們稱這類區域為“線程私有”的內存。
線程切換時需要知道在這之前當前線程已經執行到哪條指令了,所以需要記錄程序計數器的值,另外比如說線程正在進行某個計算的時候被掛起了,那么下次繼續執行的時候需要知道之前掛起時變量的值時多少,因此需要記錄CPU寄存器的狀態。所以一般來說,線程上下文切換過程中會記錄程序計數器、CPU寄存器狀態等數據。