進(jìn)程、線程的定義
- 進(jìn)程:
對于操作系統(tǒng)來說前痘,一個任務(wù)就是一個進(jìn)程凛捏,比如打開瀏覽器、打開記事本芹缔。
- 線程:
在一個進(jìn)程內(nèi)部坯癣,需要同時運(yùn)行多個該進(jìn)程內(nèi)部的任務(wù),這些內(nèi)部任務(wù)成為線程最欠,如打開QQ這個進(jìn)程示罗,同時傳輸文件和發(fā)送信息就是該進(jìn)程下的同時進(jìn)行的兩個線程
- “同時進(jìn)行”真的是同時進(jìn)行嗎蓬网?
這取決于主機(jī)的CPU,如果是多核CPU可以實(shí)現(xiàn)真正意義上的多任務(wù)鹉勒。在單核CPU中則是由操作系統(tǒng)輪流執(zhí)行各個任務(wù)帆锋,以極快的速度交替執(zhí)行各個任務(wù),讓我們誤以為同時進(jìn)行多任務(wù)處理禽额。
- 同時執(zhí)行多個任務(wù)的解決辦法
1.多進(jìn)程
2.多線程
3.多進(jìn)程+多線程
進(jìn)程和線程的對比
- 進(jìn)程:
1.操作系統(tǒng)級別作用
2.cpu使用調(diào)度锯厢,數(shù)據(jù)和代碼獨(dú)立
3.多進(jìn)程穩(wěn)定性高,不會影響主進(jìn)程和其他進(jìn)程
4.創(chuàng)建進(jìn)程代價大脯倒,Windows下系統(tǒng)運(yùn)行的進(jìn)程數(shù)有限实辑。
- 線程:
1.進(jìn)程內(nèi)部的控制流
2.cpu調(diào)度和棧是獨(dú)立的,堆和數(shù)據(jù)是共享的
3.比多進(jìn)程稍快藻丢,但任何一個線程掛掉都會影響整個進(jìn)程剪撬,因為所有線程共享進(jìn)程內(nèi)存
線程實(shí)現(xiàn)的兩種方式
- 繼承Thread,重寫run()方法
- 實(shí)現(xiàn)Runnable接口悠反,重寫run()方法
run() : 保存多線程的執(zhí)行代碼
start() : 開啟多線程残黑,啟動run()函數(shù)
線程的生命周期
- 新建狀態(tài):
使用 new 關(guān)鍵字和 Thread 類或其子類建立一個線程對象后,該線程對象就處于新建狀態(tài)斋否。它保持這個狀態(tài)直到程序 start() 這個線程梨水。
- 就緒狀態(tài):
當(dāng)線程對象調(diào)用了start()方法之后,該線程就進(jìn)入就緒狀態(tài)茵臭。就緒狀態(tài)的線程處于就緒隊列中疫诽,要等待JVM里線程調(diào)度器的調(diào)度。
- 運(yùn)行狀態(tài):
如果就緒狀態(tài)的線程獲取 CPU 資源旦委,就可以執(zhí)行 run()奇徒,此時線程便處于運(yùn)行狀態(tài)。處于運(yùn)行狀態(tài)的線程最為復(fù)雜缨硝,它可以變?yōu)樽枞麪顟B(tài)摩钙、就緒狀態(tài)和死亡狀態(tài)。
- 阻塞狀態(tài):
如果一個線程執(zhí)行了sleep(睡眠)追葡、suspend(掛起)等方法腺律,失去所占用資源之后,該線程就從運(yùn)行狀態(tài)進(jìn)入阻塞狀態(tài)宜肉。在睡眠時間已到或獲得設(shè)備資源后可以重新進(jìn)入就緒狀態(tài)匀钧。可以分為三種:
1.等待阻塞:運(yùn)行狀態(tài)中的線程執(zhí)行 wait() 方法谬返,使線程進(jìn)入到等待阻塞狀態(tài)之斯。
2.同步阻塞:線程在獲取 synchronized 同步鎖失敗(因為同步鎖被其他線程占用)。
3.其他阻塞:通過調(diào)用線程的 sleep() 或 join() 發(fā)出了 I/O 請求時遣铝,線程就會進(jìn)入到阻塞狀態(tài)佑刷。當(dāng)sleep() 狀態(tài)超時莉擒,join() 等待線程終止或超時,或者 I/O 處理完畢瘫絮,線程重新轉(zhuǎn)入就緒狀態(tài)涨冀。
- 死亡狀態(tài):
一個運(yùn)行狀態(tài)的線程完成任務(wù)或者其他終止條件發(fā)生時,該線程就切換到終止?fàn)顟B(tài)麦萤。
1.正常終止:run()方法執(zhí)行完畢后進(jìn)入此狀態(tài)
2.強(qiáng)制終止:如調(diào)用stop和destroy函數(shù)
3.異常終止:線程執(zhí)行過程中發(fā)生異常
線程常見方法
- sleep(long millis)線程休眠:暫停一段時間鹿鳖,進(jìn)入計時等待狀態(tài),★注意:此時不會釋放同步鎖
- join()聯(lián)合線程:表示這個線程(外部)等待另一個線程(內(nèi)部)死亡后才執(zhí)行
線程優(yōu)先級
用一個整數(shù)幫助系統(tǒng)確定線程的調(diào)動順序壮莹,取值范圍1-10翅帜,默認(rèn)為5.線程優(yōu)先級不能保證執(zhí)行順序,只是提高系統(tǒng)調(diào)度的概率命满,而且非常依賴平臺涝滴。
線程禮讓
yield()方法:線程讓出CPU資源,進(jìn)入到就緒狀態(tài)胶台,系統(tǒng)可能會再次調(diào)用該線程歼疮。
sleep()和yield()方法的異同
- 使當(dāng)前處于運(yùn)行狀態(tài)的線程放棄CPU資源,把機(jī)會讓給其他線程
- sleep方法會給其他線程運(yùn)行的機(jī)會概作,不考慮優(yōu)先級腋妙;yield方法會優(yōu)先給高優(yōu)先級的線程運(yùn)行機(jī)會
- 調(diào)用sleep方法后進(jìn)入計時等待狀態(tài);調(diào)用yield方法后進(jìn)入就緒狀態(tài)
wait和notify
wait()讯榕,notify(),notifyAll()是Object的方法
未完待續(xù)匙睹。愚屁。。