進(jìn)程:正在運(yùn)行的程序
多線程處于宏觀上的并行/微觀上的串行狀態(tài)
第一種實(shí)現(xiàn)多線程的方法:
????新增類繼承Thread
????重寫run方法
????在測試類中創(chuàng)建子對象調(diào)用start()方法啟動該子線程
第二種實(shí)現(xiàn)多線程的方法:
????新增類實(shí)現(xiàn)runnable
????重寫run方法
????在測試類中創(chuàng)建子對象
????創(chuàng)建線程對象,子對象作為線程對象的參數(shù),調(diào)用start()方法啟動該子線程
實(shí)際使用過程中也有其他的方法
java虛擬機(jī)啟動都會自己創(chuàng)建一個主線程
????不同的線程交替執(zhí)行,在各個計(jì)算機(jī)中是不一樣的,甚至在同一臺計(jì)算機(jī)中不同時間也是不一樣的,? ?但是交替執(zhí)行是必須的
????開啟一個子線程的方法是start(),如果直接調(diào)用run方法,那么這個run方法會被當(dāng)成一個普通的方法,不會交替執(zhí)行
線程的優(yōu)先級:????
????????優(yōu)先級的值只能是1-10的int值,超出范圍會報異常(? ? ? ? 非法參數(shù)異常)
? ? ? ? 使用方法:線程對象.setPriority(Thread.MAX_PRIORITY)
線程合并,
????當(dāng)前線程釋放cpu資源,線程暫停
????主線程需要等合并的線程全部執(zhí)行完畢后才能再次執(zhí)行,
????join之前,線程一定要處于就緒狀態(tài)
守護(hù)線程的特點(diǎn)是:
????所有的前臺的線程都結(jié)束了,后臺的線程不論有沒有執(zhí)行完畢都會消亡
????后臺線程可以比前臺線程先執(zhí)行結(jié)束
設(shè)置線程為守護(hù)線程:thread.setDaemon(true)
線程休眠:thread.sleep(時間:毫秒)
線程讓步:
????可以將當(dāng)前正在執(zhí)行的線程暫停,但不會阻塞該線程,只是將線程變成就緒狀態(tài)
? ??特點(diǎn):某個線程調(diào)用了yield方法之后,只有優(yōu)先級一致或者高于其優(yōu)先級的處于就緒狀態(tài)的線程才能有執(zhí)行的機(jī)會
????某個線程執(zhí)行yield方法讓出cpu資源后,不一定就是執(zhí)行其他的線程,也有可能繼續(xù)執(zhí)行當(dāng)前線程
線程的生命周期\
????new新建狀態(tài)? Thread? t = new Thread();
? ? runnable就緒狀態(tài),沒有獲取到cpu資源,處于可運(yùn)行狀態(tài),并沒有真正的運(yùn)行
????running運(yùn)行狀態(tài)? 就緒狀態(tài)的線程搶到了cpu的資源開始運(yùn)行就是運(yùn)行狀態(tài)
????block阻塞狀態(tài) ,執(zhí)行一些阻塞方法編程了阻塞狀態(tài),線程不運(yùn)行
????dead:死亡狀態(tài)?
????????程序運(yùn)行完畢正常結(jié)束
????????調(diào)用stop方法強(qiáng)制提前結(jié)束
sleep與wait對比
共同點(diǎn):都會拋出InterruptedException異常
sleep
????指定休息時間,自動處于可運(yùn)行狀態(tài)
????不釋放鎖
????Thread類的靜態(tài)方法,只能通過Thread類或者對象來調(diào)用
????Thread類中有兩個重載的方法
wait
????等待,需要被喚醒
????會釋放鎖
????Object類的方法,哪里都可以使用
????Object類中有3個重載方法