Day-32 線程的啟動方式? 線程的常用方法? 線程的狀態(tài)??? 臨界資源問題解決(同步)
1鸿捧、線程的啟動方式
線程有兩種啟動方式
其一是:自定義類繼承Thread類(JDK提供好的類,用于表示一個線程對象)疙渣,重寫run()方法匙奴,通過自定義類對象調(diào)用start()方法啟動線程。
其二是:自定義類實現(xiàn)Runnable接口(重寫run()方法)妄荔,通過Thread類有參構(gòu)造創(chuàng)建Thread類對像泼菌,將自定義類對象作為Thread類對像的參數(shù)。然后通過Thread類對像調(diào)用start()方法懦冰。
1.2、方法一:直接繼承Thread類
step1:創(chuàng)建一個子類谣沸,來繼承Thread類
step2:重寫run()方法刷钢,因為這是線程體:當(dāng)CPU調(diào)度執(zhí)行該線程的時候,就要執(zhí)行的是run()方法中的代碼乳附。
step3:創(chuàng)建該類的對象内地,表示一個線程,調(diào)用start()進(jìn)而啟動這個線程赋除。意味著該線程一切準(zhǔn)備就緒阱缓,隨時可以被CPU調(diào)度執(zhí)行。但是CPU是否立刻執(zhí)行举农?不一定荆针,要看CPU自己。
1.2、方法二:實現(xiàn)Runnable接口
step1:創(chuàng)建一個實現(xiàn)類航背,實現(xiàn)Runnable接口
step2:重寫run()方法
step3:先創(chuàng)建該實現(xiàn)類對象:mt喉悴,根據(jù)實現(xiàn)類對象再創(chuàng)建Thread對象,然后啟動玖媚。
1.3箕肃、對比兩種創(chuàng)建并啟動線程的方式
2、Thread類的常用方法
3、線程的狀態(tài)
線程的生命周期:5種错森,6種吟宦,7種(不同角度分法不同)。
線程new出來:新建
準(zhǔn)備就緒啟動:start()问词;
如果被CPU調(diào)度執(zhí)行:運(yùn)行狀態(tài)督函,run()方法
阻塞狀態(tài):-->進(jìn)入就緒
出生-->就緒-->運(yùn)行-->死亡
4、臨界資源問題解決(同步)
多個線程之間存在共享的數(shù)據(jù)激挪。一條線程執(zhí)行過程中辰狡,其他線程也可以訪問,可能會修改數(shù)據(jù)的值垄分。造成的共享數(shù)據(jù)的不安全宛篇。叫做臨界資源的安全問題。同步(synchronized)則是解決這一問題關(guān)鍵方法薄湿。
同步:原子性操作叫倍。同步起來的代碼,一次只能被1個線程執(zhí)行完畢豺瘤,這個過程中吆倦,不能被其他的線程插入執(zhí)行。
4.1坐求、同步代碼塊
synchronized (鎖對象) {? //上鎖
??? //被同步的代碼蚕泽,每次只能被一個線程執(zhí)行,中間不能被其他線程插入執(zhí)行
}?? //鎖打開
同步的原理:
對象的"互斥鎖":每個對象都可以看做一個鎖桥嗤。有兩種狀態(tài):打開(默認(rèn))须妻,關(guān)閉。
鎖對象:能被同時被多條線程功能訪問的對象泛领。
t1荒吏,t2,t3渊鞋,t4--->共同的一把鎖頭(同一個對象)如圖7所示绰更。
注意點(diǎn):
同步的原理:鎖定一個對象瞧挤。(對象可以和程序無關(guān),但必須是多個線程訪問的共同的對象才可以)动知。
常用的鎖對象:
this皿伺,創(chuàng)建一個對象,傳入進(jìn)去盒粮。
大招:類名.class鸵鸥,字符串常量:"abc"
4.2、同步方法
//該方法丹皱,每次只能有一個線程來執(zhí)行妒穴,期間,不能被其他的線程插入執(zhí)行摊崭。
public? synchronized?? void 方法名(){
}
4.3讼油、同步的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):解決了多線程之間的共享數(shù)據(jù)的安全問題
缺點(diǎn):降低效率,容易“死鎖”如圖8所示呢簸。