概念
進程:具有一定獨立功能的程序關于某個數(shù)據(jù)集合上的一次運行活動,進程是系統(tǒng)進行資源分配和調(diào)度的一個獨立單位。
線程:是進程的一個實體,是CPU調(diào)度和分派的基本單位,它是比進程更小的能獨立運行的基本單位奄喂。
關系:1.相對進程而言,線程是一個更加接近于執(zhí)行體的概念永脓,是進程的一部分;
? ? ? ? ? ?2.線程可以與同進程中的其他線程共享數(shù)據(jù)脯倒,但擁有自己的椊鹱伲空間不从,擁有獨立的執(zhí)行序列惜姐;
? ? ? ? ? ?3.一個程序至少有一個進程,一個進程至少有一個線程;
多線程:包含多個能并發(fā)運行的線程椿息,能充分利用CPU歹袁。
線程的生命周期
線程是一個動態(tài)執(zhí)行的過程,它也有一個從產(chǎn)生到死亡的過程寝优。
新建狀態(tài):創(chuàng)建線程對象后(new Thread或其子類)条舔,該線程處于新建狀態(tài),直到start()乏矾;
就緒狀態(tài):線程對象調(diào)用start()方法后孟抗,該線程進入就緒狀態(tài),處于就緒隊列中钻心,等待JVM線程調(diào)度器調(diào)度凄硼;
運行狀態(tài):就緒狀態(tài)線程獲取到CPU資源,執(zhí)行run()方法捷沸,該線程處于運行狀態(tài)摊沉,此時可變?yōu)樽枞⒕途w痒给、或死亡狀態(tài)说墨;
阻塞狀態(tài):如果線程執(zhí)行sleep()、suspend()等方法苍柏,失去所占用資源尼斧,該線程從運行--》阻塞狀態(tài),睡眠時間到達或獲得資源進入就緒狀態(tài)试吁;
? ?????????????????等待阻塞:運行狀態(tài)中的線程執(zhí)行 wait() 方法突颊,使線程進入到等待阻塞狀態(tài);
? ? ? ? ? ? ? ? ? ?同步阻塞:線程在獲取 synchronized 同步鎖失敗(因為同步鎖被其他線程占用);
? ? ? ? ? ? ? ? ? ?其他阻塞:通過調(diào)用線程的 sleep() 或 join() 發(fā)出了 I/O 請求時律秃,線程就會進入到阻塞狀態(tài)爬橡, ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?當sleep() 狀態(tài)超時,join() 等待線程終止或超時棒动,或者 I/O 處理完畢糙申,線程重新轉(zhuǎn)入就緒狀態(tài);
死亡狀態(tài):一個運行狀態(tài)的線程完成任務或者其他終止條件發(fā)生時船惨,該線程就切換到終止狀態(tài)柜裸;
線程的優(yōu)先級
意義:每一個 Java 線程都有一個優(yōu)先級,這樣有助于操作系統(tǒng)確定線程的調(diào)度順序粱锐;
級別:用1-10之間的整數(shù)表示疙挺,數(shù)值越大優(yōu)先級越高,默認的優(yōu)先級為5怜浅;
注意:線程優(yōu)先級不能保證線程執(zhí)行的順序铐然,優(yōu)先級高的線程獲取CPU資源的概率較大,優(yōu)先級低的并非沒機會執(zhí)行恶座;
線程的創(chuàng)建
Java 提供了三種創(chuàng)建線程的方法:
????????1.通過實現(xiàn) Runnable 接口搀暑;
????????2.通過繼承 Thread 類本身;
????????3.通過 Callable 和 Future 創(chuàng)建線程跨琳;
一自点、實現(xiàn)Runnable接口
核心:Thread(Runnable threadOb); ? ?//創(chuàng)建Thread類傳入實現(xiàn)了runnable接口的實現(xiàn)類(重寫run方法)
二、繼承Thread類
核心:創(chuàng)建繼承了Thread類的子類實例(重寫run方法)脉让,調(diào)用start()桂敛;(本質(zhì)上也是實現(xiàn)了runnable接口)
三、實現(xiàn)?Callable 接口
核心:Callable接口類似Runnable接口溅潜,不同點在于Callable有返回值术唬,使用時實現(xiàn)類實例需要Future包裹一層。
總結(jié):1.繼承Thread伟恶,特點:單繼承問題碴开,獲取當前線程可直接用this,無需使用Thread.currentThread() 博秫;
? ? ? ? ? ?2.實現(xiàn)Runnable潦牛,特點:傳入Thread構造;
? ? ? ? ? ?3.實現(xiàn)Callable挡育,特點:有返回值巴碗,F(xiàn)utureTask包裹后傳入Thread構造;