1. 線程是什么?進程是什么?
線程是進程中的一個實體,線程本身是不會獨立存在的.
進程是代碼在數(shù)據(jù)集合上的一次運行活動,是系統(tǒng)進行資源分配和調(diào)度額基本單位,線程則是進程的一個執(zhí)行路徑。一個進程中至少有一個線程,進程中的多個線程共享進程資源.
操作系統(tǒng)在分配資源的時候是把資源分配給進程,但是CPU的資源比較特殊,它是被分配到線程的。因為真正要占用CPU運行的是線程,所以也說線程是CPU的基本單位.
2. 進程和線程的關(guān)系
在Java中,當我們啟動了main函數(shù)的時候其實就是啟動了一個JVM的進程,而main函數(shù)所在的線程就是這個進程中的一個線程,也稱主線程。

一個進程中有多個線程,多個線程共享進程中的堆和方法區(qū)的資源。 但是每個線程都有自己的程序計數(shù)器和棧區(qū)域.
程序計數(shù)器是一塊內(nèi)存區(qū)域,用來記錄線程當前要執(zhí)行的指令地址,歸線程私有。
CPU一般是使用時間片輪轉(zhuǎn)的方式讓線程輪詢占用,所以當前線程CPU時間片用完之后就會讓出CPU.等到下次輪詢的時候再執(zhí)行.
而程序計數(shù)器就是記錄當該線程讓出CPU的時候的執(zhí)行地址,等到下次再分配到時間片的時候線程就可以從自己私有的計數(shù)器上的指定地址繼續(xù)執(zhí)行。
3. Java 的native方法
簡單地講,一個Native Method就是一個java調(diào)用非java代碼的接口。一個Native Method是這樣一個java的方法:該方法的實現(xiàn)由非java語言實現(xiàn),比如C。這個特征并非java所特有,很多其它的編程語言都有這一機制,比如在C++中,你可以用extern "C"告知C++編譯器去調(diào)用一個C的函數(shù)。
介紹完了Native方法之后,接著上面的程序計數(shù)器 如果執(zhí)行的是Native方法,那么 pc 計數(shù)器記錄 的是 undefined 地址,只有執(zhí)行的是 Java 代碼時 pc 計數(shù)器記錄的才是
下一條指令的地址 。
另外每個線程都有自 己的棧資源,用于存儲該線程的局部變量,這些局部變量是該線
程私有的,其他線程是訪問不了的,除此之外枝還用來存放線程的調(diào)用棧幀 。
堆是一個進程中最大的一塊內(nèi)存,堆是被進程中的所有線程共享的,是進程創(chuàng)建時分
配的,堆里面主要存放使用 new 操作創(chuàng)建的對象實例 。
方法區(qū)則用來存放 JVM 加載的類、常量及靜態(tài)變量等信息,也是線程共享的 。