線程與進(jìn)程
線程:進(jìn)程中負(fù)責(zé)程序執(zhí)行的執(zhí)行單元,線程本身依靠程序進(jìn)行運(yùn)行,線程是程序中的順序控制流,只能使用分配給程序的資源和環(huán)境。
進(jìn)程:執(zhí)行中的程序,一個進(jìn)程至少包含一個線程。
可以將一個正在運(yùn)行的.exe程序理解為一個進(jìn)程

線程是進(jìn)程中獨(dú)立運(yùn)行的子任務(wù),比如QQ.exe有視屏線程、下載文件線程、傳輸數(shù)據(jù)線程等在后臺默默的運(yùn)行。線程允許在一個進(jìn)程中存在多個程序控制流,線程會共享進(jìn)程范圍的資源,例如內(nèi)存句柄和文件句柄,但每個線程都有各自的計數(shù)器、棧和局部變量等。線程可以看做一個基本的調(diào)度單位,如果沒有明確的協(xié)同機(jī)制,那么線程將彼此獨(dú)立運(yùn)行。當(dāng)一個線程訪在使用一個變量,而另一個線程在同時訪問這個變量時將造成不可預(yù)料的后果。
多線程的優(yōu)點(diǎn):充分使用cpu資源

如果任務(wù)一等待遠(yuǎn)程服務(wù)器返回數(shù)據(jù),那么cpu就會一直處于等待狀態(tài)任務(wù)二必須等任務(wù)一運(yùn)行完之后才能運(yùn)行,CPU利用率大幅度降低。
使用多線程
繼承Thread類
創(chuàng)建好了自己的線程類之后,就可以創(chuàng)建線程對象了,然后通過start()方法去啟動線程。注意,不是調(diào)用run()方法啟動線程,run方法中只是定義需要執(zhí)行的任務(wù),如果調(diào)用run方法,即相當(dāng)于在主線程中執(zhí)行run方法,跟普通的方法調(diào)用沒有任何區(qū)別
實現(xiàn)Runnable接口
Runnable的中文意思是“任務(wù)”,顧名思義,通過實現(xiàn)Runnable接口,我們定義了一個子任務(wù),然后將子任務(wù)交由Thread去執(zhí)行。注意,這種方式必須將Runnable作為Thread類的參數(shù),然后通過Thread的start方法來創(chuàng)建一個新線程來執(zhí)行該子任務(wù)。如果調(diào)用Runnable的run方法的話,是不會創(chuàng)建新線程的,這根普通的方法調(diào)用沒有任何區(qū)別。

線程狀態(tài)
1、新建狀態(tài)(New):新創(chuàng)建了一個線程對象。
2、就緒狀態(tài)(Runnable):線程對象創(chuàng)建后,其他線程調(diào)用了該對象的start()方法。該狀態(tài)的線程位于可運(yùn)行線程池中,變得可運(yùn)行,等待獲取CPU的使用權(quán)。
3、運(yùn)行狀態(tài)(Running):就緒狀態(tài)的線程獲取了CPU,執(zhí)行程序代碼。
4、阻塞狀態(tài)(Blocked):阻塞狀態(tài)是線程因為某種原因放棄CPU使用權(quán),暫時停止運(yùn)行。直到線程進(jìn)入就緒狀態(tài),才有機(jī)會轉(zhuǎn)到運(yùn)行狀態(tài)。阻塞的情況分三種:
(一)、等待阻塞:運(yùn)行的線程執(zhí)行wait()方法,JVM會把該線程放入等待池中。
(二)、同步阻塞:運(yùn)行的線程在獲取對象的同步鎖時,若該同步鎖被別的線程占用,則JVM會把該線程放入鎖池中。
(三)、其他阻塞:運(yùn)行的線程執(zhí)行sleep()或join()方法,或者發(fā)出了I/O請求時,JVM會把該線程置為阻塞狀態(tài)。當(dāng)sleep()狀態(tài)超時、join()等待線程終止或者超時、或者I/O處理完畢時,線程重新轉(zhuǎn)入就緒狀態(tài)。
5、死亡狀態(tài)(Dead):線程執(zhí)行完了或者因異常退出了run()方法,該線程結(jié)束生命周期。

常用方法
1、currentThread()返回當(dāng)前代碼段正在被哪個線程調(diào)用
2、isAlive()判斷當(dāng)前線程是否處于活動狀態(tài)
3、sleep()方法在指定的毫秒數(shù)內(nèi)讓當(dāng)前“正在執(zhí)行的線程”休眠(暫停執(zhí)行)
4、getId()獲取線程的唯一標(biāo)識
5、yield()放棄當(dāng)前的cpu資源,讓給其他的任務(wù)占用cpu執(zhí)行
停止線程
java中有三種方法可以終止正在運(yùn)行的線程:
- 使用退出標(biāo)志,使線程正常退出,也就是當(dāng)run方法完成后線程終止
- 使用stop方法強(qiáng)行終止線程,但不推薦,stop會釋放鎖給數(shù)據(jù)造成不一致性的結(jié)果,stop和suspend以及resume一樣,都是過期的方法,使用它們可能會產(chǎn)生不可預(yù)料的結(jié)果,
- 使用interrupt方法中斷線程,但不會真的停止線程,而是在當(dāng)前線程打了一個停止的標(biāo)記。
判斷線程是否中止:
this.interrupted:測試當(dāng)前狀態(tài)是否是中斷狀態(tài),執(zhí)行后具有將狀態(tài)標(biāo)志清除為false的功能。
this.isInterrupted測試線程Thread對象是否已經(jīng)是中斷狀態(tài),但不清除狀態(tài)標(biāo)志。
線程的優(yōu)先級
線程的優(yōu)先級分為1~10個等級,線程的優(yōu)先級具有繼承性,比如A線程啟動了B線程,則B線程的優(yōu)先級與A是一樣的。setPriority()可以用來設(shè)置線程的優(yōu)先級。優(yōu)先級具有
守護(hù)線程
java線程有兩種線程,一種是用戶線程,另一種是守護(hù)線程。當(dāng)進(jìn)程轉(zhuǎn)中不存在非守護(hù)線程時,守護(hù)線程自動銷毀,典型的就是GC(垃圾回收器)線程。