1. 程式人生 > >JAVA進程與線程

JAVA進程與線程

類繼承 包括 暫停 資源 運行 接口 一秒 多線程 恢復

進程相當於世界,線程相當於各個國家,互相獨立。可共享空氣等等,同時也有自己的私有資源。
每個進程都有主線程main線程也就是我們程序入口main方法,會被JVM自動創建。
CPU處理一段代碼的時間稱之為時間片,時間片很短只有幾毫秒所以多線程運行隨機,一個時間片可能執行幾次for循環也可能執行十幾次for循環因為時間片用完了。即將代碼轉譯成0101二進制。
線程被CPU執行是靠搶時間(CPU執行權限) 為什麽會多線程加快程序運行時間 因為CPU處理指令需要其他硬件配合需要耗費時間此時CPU空閑。
比如線程A搶到時間片(幾毫秒)去讀取文件,那麽CPU要先等文件先從硬盤讀取到內存才能執行,這中間的時間CUP空閑。所以浪費時間。

線程分為 前臺前程:
1、main線程(即main方法)以及所有new出來的線程。
2、後臺線程(又稱守護線程/精靈線程):比如GC,GC只考慮堆得中的內存。
特點:前臺程序(包括main線程在內除GC外的所有線程)執行完畢就會關閉JVM虛擬機。所以前臺線程運行完畢,後臺線程隨JVM一起關閉堆中殘余的垃圾不會被GC回收而是隨著JVM關閉一起被銷毀。

線程的創建分為兩種:
1、A類繼承父類Thread,Thread t = new A();
2、B類實現接口Runnable接口,Runnable b = new B();Thread t2 = new Thread(b);

線程的使用:1、去執行非常耗時的代碼。2、讓多個代碼同時執行。
線程狀態:新建狀態即new --> start方法調用後處於就緒狀態(只有就緒狀態才有資格去準備搶CPU執行權限)-->搶到時間片進入運行狀態(執行run方法代碼,如果執行到某個阻塞代碼就會進入阻塞狀態
,進入阻塞狀態就會讓出CPU執行權限,等待恢復就緒狀態再去搶奪CPU)-->如果時間片用完了代碼沒用完就回到就緒狀態,等下次搶到時間片再繼續執行上次剩下的代碼,
否則當執行完run方法所有代碼(不管時間片有沒有用完)都會進入死亡狀態。

阻塞狀態:代碼暫停運行,釋放CPU執行權限冰泉不參與CPU的爭奪。包括以下幾個:
1、掛起:sleep(毫秒)、join()、yield();
恢復就緒狀態:
sleep(毫秒):睡覺時間完了。
main(){
t.sleep(1000)//t線程會睡眠一秒在這一秒不會搶奪CPU權限,當睡眠時間一秒結束t線程就會回到就緒狀態重新搶奪CPU執行權限。
}
join:main()
{
t1.join();//掛起main線程,main線程會等待t1線程死亡才會回到就緒狀態。
}
yield:主動讓出CPU執行權限立刻回到就緒狀態進行下一次CPU權限搶奪。

JAVA進程與線程