1. 線程是什么?進(jìn)程是什么弯院?
線程是進(jìn)程中的一個實體辱士,線程本身是不會獨立存在的.
進(jìn)程是代碼在數(shù)據(jù)集合上的一次運行活動,是系統(tǒng)進(jìn)行資源分配和調(diào)度額基本單位,線程則是進(jìn)程的一個執(zhí)行路徑。一個進(jìn)程中至少有一個線程,進(jìn)程中的多個線程共享進(jìn)程資源.
操作系統(tǒng)在分配資源的時候是把資源分配給進(jìn)程听绳,但是CPU的資源比較特殊颂碘,它是被分配到線程的。因為真正要占用CPU運行的是線程椅挣,所以也說線程是CPU的基本單位.
2. 進(jìn)程和線程的關(guān)系
在Java中,當(dāng)我們啟動了main函數(shù)的時候其實就是啟動了一個JVM的進(jìn)程头岔,而main函數(shù)所在的線程就是這個進(jìn)程中的一個線程,也稱主線程鼠证。
一個進(jìn)程中有多個線程峡竣,多個線程共享進(jìn)程中的堆和方法區(qū)的資源。 但是每個線程都有自己的程序計數(shù)器和棧區(qū)域.
程序計數(shù)器是一塊內(nèi)存區(qū)域量九,用來記錄線程當(dāng)前要執(zhí)行的指令地址适掰,歸線程私有。
CPU一般是使用時間片輪轉(zhuǎn)的方式讓線程輪詢占用,所以當(dāng)前線程CPU時間片用完之后就會讓出CPU.等到下次輪詢的時候再執(zhí)行.
而程序計數(shù)器就是記錄當(dāng)該線程讓出CPU的時候的執(zhí)行地址娩鹉,等到下次再分配到時間片的時候線程就可以從自己私有的計數(shù)器上的指定地址繼續(xù)執(zhí)行攻谁。
3. Java 的native方法
簡單地講,一個Native Method就是一個java調(diào)用非java代碼的接口弯予。一個Native Method是這樣一個java的方法:該方法的實現(xiàn)由非java語言實現(xiàn)戚宦,比如C。這個特征并非java所特有锈嫩,很多其它的編程語言都有這一機(jī)制受楼,比如在C++中垦搬,你可以用extern "C"告知C++編譯器去調(diào)用一個C的函數(shù)。
介紹完了Native方法之后艳汽,接著上面的程序計數(shù)器 如果執(zhí)行的是Native方法猴贰,那么 pc 計數(shù)器記錄 的是 undefined 地址,只有執(zhí)行的是 Java 代碼時 pc 計數(shù)器記錄的才是
下一條指令的地址 河狐。
另外每個線程都有自 己的棧資源米绕,用于存儲該線程的局部變量,這些局部變量是該線
程私有的馋艺,其他線程是訪問不了的栅干,除此之外枝還用來存放線程的調(diào)用棧幀 。
堆是一個進(jìn)程中最大的一塊內(nèi)存捐祠,堆是被進(jìn)程中的所有線程共享的碱鳞,是進(jìn)程創(chuàng)建時分
配的,堆里面主要存放使用 new 操作創(chuàng)建的對象實例 踱蛀。
方法區(qū)則用來存放 JVM 加載的類窿给、常量及靜態(tài)變量等信息,也是線程共享的 率拒。