進(jìn)程:正在運(yùn)行中的程序
線程:線程共享存儲(chǔ)空間,為了讓多個(gè)方法能夠同時(shí)運(yùn)行
單線程的優(yōu)點(diǎn):安全宜雀,但是效率不行
多線程:效率高切平,但是會(huì)有潛在的問題
線程的運(yùn)行模式
分時(shí)調(diào)度
平均分配時(shí)間
搶占模式
根據(jù)優(yōu)先級分配不同的線程時(shí)間。
優(yōu)先級高的程序占用更多的CPU時(shí)間辐董。
main 的主線程
程序從上到下執(zhí)行過程
- java demo
- 啟動(dòng) JVM悴品,運(yùn)行 Demo.main
- JVM 運(yùn)行方法 main,找操作系統(tǒng),開線程
- 對于CPU有了一個(gè)執(zhí)行的路徑简烘,運(yùn)行方法main路徑有個(gè)名字 "main"
Thread 類 線程
虛擬機(jī)允許線程并發(fā)運(yùn)行多個(gè)程序
創(chuàng)建新執(zhí)行線程有兩種方法
一種將類申明為 Thread 子類
一種是重寫 runnable 方法
線程繼承 Thread
用 start 啟動(dòng)
會(huì)自動(dòng)讓虛擬機(jī)找到 run 方法
獲取線程名字的方法 getName
每個(gè)線程都有默認(rèn)的編號名稱 Thread -0,1....
非靜態(tài)
currentThread
jvm 開啟主線程 Thread 類對象
static Thread currentThread() 返回正在執(zhí)行的線程對象
setName
應(yīng)該先改名苔严,再開啟線程
Thread.setName()
sleep
休眠制定方法
Thread.sleep(ms)
實(shí)現(xiàn) runnable 接口
重寫 run 方法
接口可以多實(shí)現(xiàn); 繼承只能單繼承
實(shí)現(xiàn) runnable 接口的好處
- 更加符合面向?qū)ο螅€程分為兩部分孤澎,一部分線程對象届氢,一部分線程任務(wù)
- 繼承 Thread 類時(shí),線程對象和線程任務(wù)耦合在一起覆旭,一旦創(chuàng)建Thread 類的子類任務(wù)退子,既是線程對象岖妄,又是線程任務(wù)。
- 實(shí)現(xiàn)Runnable 接口寂祥,將線程任務(wù)單獨(dú)分離出來封裝成對象衣吠,類型就是 Runnable 接口類型,Runnable 接口對線程對象和線程任務(wù)進(jìn)行解耦壤靶。
高內(nèi)聚缚俏,低耦合
讓資源實(shí)現(xiàn)共享
匿名內(nèi)部類實(shí)現(xiàn)多線程
節(jié)省代碼,但是 格式比較奇怪
線程的狀態(tài)
- new 至今尚未啟動(dòng)的線程: new Thread()
- runnable 運(yùn)行狀態(tài)贮乳,正在執(zhí)行 start()
- terminated 死亡狀態(tài) run() 結(jié)束 stop()(不建議)
- blocked 受阻塞 和運(yùn)行狀態(tài)轉(zhuǎn)換 取決于 CPU 運(yùn)行狀態(tài)
- timed waitting 休眠忧换,一定時(shí)間之后會(huì)自動(dòng)喚醒 運(yùn)行 sleep 的狀態(tài)、
-
waitting 無限的等待 使用 notify 進(jìn)行 喚醒 在 object 類中
受阻塞: 線程具有 CPU 執(zhí)行資格向拆,等待 CPU 的資源
休眠等待:線程放棄CPU的執(zhí)行資格
線程池
線程池基本概念
一個(gè)可以容納多個(gè)線程的容器亚茬,其中的線程可以反復(fù)使用,省去了頻繁創(chuàng)建線程對象的操作浓恳,無需反復(fù)創(chuàng)建線程而消耗過多資源刹缝。
緩沖池 減少資源開銷
新建和銷毀線程,會(huì)造成較大的開銷颈将,需要減少這兩種操作
JDK5 之后梢夯,內(nèi)置了線程池
JDK5 中的線程池
使用工廠類
java
public class ThreadPoolDemo{
}