進(jìn)程:一個進(jìn)程包括由操作系統(tǒng)分配的內(nèi)存空間,包含一個或多個線程。一個線程不能獨(dú)立的存在,它必須是進(jìn)程的一部分。一個進(jìn)程一直運(yùn)行,直到所有的非守護(hù)線程都結(jié)束運(yùn)行后才能結(jié)束.
多線程能滿足程序員編寫高效率的程序來達(dá)到充分利用CPU的目的。
一個線程的生命周期

- 新建狀態(tài):
使用new關(guān)鍵字和Thread類或子類建立一個線程對象后,該線程對象就處于新建狀態(tài)。保持這個狀態(tài)直到程序start()這個線程 - 就緒狀態(tài)
調(diào)用start()方法后。就緒狀態(tài)的線程處于就緒隊列中,要等待JVM里線程調(diào)度器的調(diào)度。 - 運(yùn)行狀態(tài):
如果就緒狀態(tài)的線程獲取CPU資源,就可以執(zhí)行run(),此時線程便處于運(yùn)行狀態(tài)。運(yùn)行 - 阻塞狀態(tài):
線程執(zhí)行sleep(睡眠)suspend(掛起)等方法,失去所占用資源之后,由運(yùn)行狀態(tài)進(jìn)入阻塞狀態(tài)。
睡眠狀態(tài)已到或獲得設(shè)備資源后可以重新進(jìn)入就緒狀態(tài)。- 等待阻塞:運(yùn)行狀態(tài)執(zhí)行wait()方法。
- 同步阻塞:線程在獲取同步鎖失敗(因?yàn)橥芥i被其他線程占用)。
-其他阻塞:通過調(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):
完成任務(wù)或者其他終止條件發(fā)生時。
線程的優(yōu)先級
Java線程的優(yōu)先級是整數(shù),其取值范圍是
1 (Thread.MIN_PRIORITY ) - 10 (Thread.MAX_PRIORITY )
默認(rèn)情況下,每一個線程都會分配一個優(yōu)先級 NORM_PRIORITY(5)
具有較高優(yōu)先級的線程對程序更重要,并且應(yīng)該在低優(yōu)先級的線程之前分配處理器資源。
但是,線程優(yōu)先級不能保證線程執(zhí)行的順序,而且非常依賴于平臺。
創(chuàng)建一個線程
三種方法
- 實(shí)現(xiàn)Runnable接口
- 通過集成Thread類本身
- 通過Callable和Future創(chuàng)建線程
創(chuàng)建線程的三種方式的對比
采用實(shí)現(xiàn) Runnable、Callable 接口的方式創(chuàng)建多線程時,線程類只是實(shí)現(xiàn)了 Runnable 接口或 Callable 接口,還可以繼承其他類。
使用繼承 Thread 類的方式創(chuàng)建多線程時,編寫簡單,如果需要訪問當(dāng)前線程,則無需使用 Thread.currentThread() 方法,直接使用 this 即可獲得當(dāng)前線程。
使用
有效利用多線程的關(guān)鍵是理解程序是并發(fā)執(zhí)行而不是串行執(zhí)行的。例如:程序中有兩個子系統(tǒng)需要并發(fā)執(zhí)行,這時候就需要利用多線程編程。
通過對多線程的使用,可以編寫出非常高效的程序。不過請注意,如果你創(chuàng)建太多的線程,程序執(zhí)行的效率實(shí)際上是降低了,而不是提升了。
請記住,上下文的切換開銷也很重要,如果你創(chuàng)建了太多的線程,CPU 花費(fèi)在上下文的切換的時間將多于執(zhí)行程序的時間!
參考:菜鳥教程
https://www.runoob.com/java/java-multithreading.html