- 定義
進程
是指一個內(nèi)存中運行中的應用程序溜哮,進程是系統(tǒng)進行資源分配的最小單位瞻鹏。
線程
進程的一個實體,是CPU調(diào)度和分派的基本單位,它是比進程更小的能獨立運行的基本單位郊酒。線程自己基本上不擁有系統(tǒng)資源,只擁有一點在運行中必不可少的資源(如程序計數(shù)器,一組寄存器和棧),但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源。
關(guān)系
一個線程可以創(chuàng)建和撤銷另一個線程;同一個進程中的多個線程之間可以并發(fā)執(zhí)行.
一個進程至少包含一個線程护桦。
Java程序的進程里至少包含主線程和垃圾回收線程(后臺線程)-
進程與線程的區(qū)別
進程有獨立的內(nèi)存空間,進程中的數(shù)據(jù)存放空間(堆空間和椉褰浚空間)是獨立的二庵。線程堆空間是共享的,椈呵海空間是獨立的催享,線程消耗的資源也比進程小,相互之
間是可以影響的强经。相對進程而言睡陪,線程是一個更加接近于執(zhí)行體的概念,它可以與同進程中的其
他線程共享數(shù)據(jù)匿情,但擁有自己的椑计龋空間,擁有獨立的執(zhí)行序列炬称。 線程調(diào)度
計算機通常只有一個CPU時汁果,在任意時刻只能執(zhí)行一條計算機指令,每個線程只有獲得CPU的使用權(quán)才能執(zhí)行指令
所謂多線程并發(fā)運行玲躯,從宏觀看据德,其實各個線程輪流獲得CPU的使用權(quán),分別執(zhí)行各自的任務跷车。那么棘利,在可運行池中,會有多個線程處于就緒狀態(tài)等到CPU朽缴,JVM就負責了線程的調(diào)度善玫,
JVM采用的時搶占式調(diào)度,因此可能造成多線程執(zhí)行結(jié)果的隨機性Java線程的狀態(tài)
- 新建狀態(tài)(New)
當線程對象對創(chuàng)建后密强,即進入了新建狀態(tài)茅郎,如:
Thread thread = new Thread();
- 就緒狀態(tài)(Runnable)
當調(diào)用線程對象的start()方法蜗元,線程即進入就緒狀態(tài)。處于就緒狀態(tài)的線程系冗,只是說明此線程已經(jīng)做好了準備奕扣,隨時等待CPU調(diào)度執(zhí)行,并不是說執(zhí)行了t.start()此線程立即就會執(zhí)行掌敬; - 運行狀態(tài)(Running)
當CPU開始調(diào)度處于就緒狀態(tài)的線程時惯豆,此時線程才得以真正執(zhí)行,即進入到運行狀態(tài)奔害。 - 阻塞狀態(tài)(Blocked)
處于運行狀態(tài)中的線程由于某種原因循帐,暫時放棄對CPU的使用權(quán),停止執(zhí)行舀武,此時進入阻塞狀態(tài),直到其進入到就緒狀態(tài)离斩,才 有機會再次被CPU調(diào)用以進入到運行狀態(tài)银舱。根據(jù)阻塞產(chǎn)生的原因不同,阻塞狀態(tài)又可以分為三種:- 等待阻塞:運行狀態(tài)中的線程執(zhí)行wait()方法跛梗,使本線程進入到等待阻塞狀態(tài)寻馏;
- 同步阻塞:線程在獲取synchronized同步鎖失敗(因為鎖被其它線程所占用),它會進入同步阻塞狀態(tài)核偿;
- 其他阻塞:通過調(diào)用線程的sleep()或join()或發(fā)出了I/O請求時诚欠,線程會進入到阻塞狀態(tài)。當sleep()狀態(tài)超時漾岳、join()等待線程終止或者超時轰绵、或者I/O處理完畢時,線程重新轉(zhuǎn)入就緒狀態(tài)尼荆。
- 死亡狀態(tài)(Dead)
線程執(zhí)行完了或者因異常退出了run()方法左腔,該線程結(jié)束生命周期。