2019年5月9日尚學(xué)堂部分筆記

今天主要學(xué)習(xí)線程的一些常用方法和線程同步赫粥,線程間的通信問題龟劲。

最開始說了線程的生命周期:

新生狀態(tài):就是當(dāng)你用new關(guān)鍵字建立一個線程后胃夏,通過start()方法進(jìn)入就緒的狀態(tài)。

就緒狀態(tài):處于就緒狀態(tài)的線程具備了運(yùn)行的條件昌跌,但是沒有CPU分配到資格仰禀,就像你有紙沒有廁所位。當(dāng)系統(tǒng)為你分配CPU的時候蚕愤,你就等于有了廁所位答恶,就可以開始執(zhí)行狀態(tài),這個動作叫做【CPU調(diào)度】萍诱;

運(yùn)行狀態(tài):當(dāng)運(yùn)行狀態(tài)的線程執(zhí)行自己的run方法中代碼悬嗓,直到等到某資源而阻塞或完成任何而死亡

系統(tǒng)給你分配CPU,是有時間限制的裕坊,如果你在這個時間片里沒有完成包竹,那系統(tǒng)就會把你換下來,變成等待執(zhí)行的狀態(tài)籍凝,CPU給了其他線程周瞎。

阻塞狀態(tài):

有以下幾種情況會導(dǎo)致阻塞【執(zhí)行了sleep(睡眠)方法】【等到I/O設(shè)備等資源】【將讓出CPU并暫時停止自己運(yùn)行】

在阻塞狀態(tài)的線程不能進(jìn)入就緒隊(duì)列。只有當(dāng)引起阻塞的原因消除時静浴,如睡眠時間已到堰氓,或等待的I/O設(shè)備空閑下來挤渐,線程便轉(zhuǎn)入就緒狀態(tài)苹享,重新到就緒隊(duì)列中排隊(duì)等待,被系統(tǒng)選中后從原來停止的位置開始繼續(xù)執(zhí)行浴麻。

死亡狀態(tài):

死亡狀態(tài)是線程生命周期中的最后一個階段得问。線程死亡的原因有三個,一個是正常運(yùn)行

的線程完成了它的全部工作软免;另一個是線程被強(qiáng)制性地終止宫纬,如通過stop方法來終止一個

線程【不推薦使用】;三是線程拋出未捕獲的異常膏萧。

線程的一些常用方法:

設(shè)置線程的優(yōu)先級

public static void main(String[] args) {

System.out.println(Thread.MIN_PRIORITY);

System.out.println(Thread.MAX_PRIORITY);

System.out.println(Thread.NORM_PRIORITY);

//主線程的優(yōu)先級(默認(rèn)優(yōu)先級)

System.out.println(Thread.currentThread ().getPriority());

Thread01 t1 = new Thread01();

// 設(shè)置線程的優(yōu)先級

t1.setPriority(Thread.MAX_PRIORITY);

t1.start();

Thread01 t2 = new Thread01();

// 設(shè)置線程的優(yōu)先級

t2.setPriority(Thread.MIN_PRIORITY);

t2.start();

}

注意:設(shè)置優(yōu)先級別搞漓骚,只是被CPU調(diào)度的概率大,不是一定就是最先的

判斷線程是否處于活動狀態(tài):

關(guān)鍵字:isAlive

Thread01 t1 = new Thread01();

System.out.println(t1.isAlive());

// 設(shè)置線程的優(yōu)先級

t1.setPriority(Thread.MAX_PRIORITY);

t1.start();

System.out.println(t1.isAlive());

線程調(diào)用Start之后就處于活動狀態(tài)

Join

調(diào)用這個關(guān)鍵字的線程強(qiáng)制執(zhí)行榛泛,其他線程阻塞狀態(tài)蝌蹂,等該線程執(zhí)行完畢后,其他線程再執(zhí)行曹锨。Join稱為線程的強(qiáng)制執(zhí)行孤个,有可能被外界中斷產(chǎn)生InterruptedException 中斷異常。

關(guān)鍵字:sleep(睡眠沛简,單位:毫秒)

在指定的毫秒數(shù)內(nèi)讓當(dāng)前正在執(zhí)行的線程休眠(暫停執(zhí)行)齐鲤,休眠的線程進(jìn)入阻塞狀態(tài)

關(guān)鍵字:yield

當(dāng)前線程給cpu調(diào)度器一個暗示斥废,暗示其想禮讓一次其擁有的cpu,CPU調(diào)度者也可以忽略這次暗示给郊。此時當(dāng)前線程進(jìn)入就緒狀態(tài)牡肉。

線程的終止:

目前而言,不推薦使用stop直接終止線程淆九。用interrupt()方法去中斷正在執(zhí)行的線程荚板,而在線程內(nèi)部一定要寫捕獲中斷的異常。通過異常處理機(jī)制正常結(jié)束線程吩屹。

線程同步:

線程在執(zhí)行過程中跪另,通過cpu的調(diào)度,執(zhí)行軌跡不確定煤搜,對共享資源的訪問很容易造成數(shù)據(jù)的錯誤免绿。我們稱這個錯亂稱為線程安全問題。

同步的概念:

原子性操作:一個操作要么一次性做完擦盾,要么根本不開始嘲驾,不存在中間狀態(tài)。

案例:ATM取現(xiàn)操作

同步就是讓操作保持原子性迹卢!java提供兩種方式實(shí)現(xiàn)同步辽故。

【第一種:同步代碼塊】

把所有的同步操作放到同步代碼塊中

synchronized (mutex) {

? // .. .

}

mutex 稱為互斥鎖/同步鎖。對共享資源進(jìn)行加鎖實(shí)現(xiàn)同步腐碱。一般用共享資源作為同步鎖誊垢,也稱同步監(jiān)視器。

public class MyRun implements Runnable {

// 共享資源

private int count = 5;

@Override

public void run() {

// 模擬一個窗口5個人

for (int i = 0; i < 5; i++) {

// 同步代碼塊

// mutex 互斥鎖

synchronized (this) {

if (count > 0) {

try {

Thread.sleep(3000);

count--;

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println(Thread.currentThread().getName()+"賣出一張票症见,還剩" + count + "張票");

}

}

}

}

}

總結(jié):

synchronized(obj){}中的obj稱為同步監(jiān)視器

同步代碼塊中同步監(jiān)視器可以是任何對象喂走,但是推薦使用共享資源作為同步監(jiān)視器

【第二種,同步方法】

如果同步代碼(原子性)很多谋作,可以考慮使用同步方法芋肠。

把普通方法用 synchronized 修飾,同步方法的同步監(jiān)視器是this遵蚜。

public class MyRun implements Runnable {

// 共享資源

private int count = 5;

@Override

public void run() {

// 模擬一個窗口5個人

for (int i = 0; i < 5; i++) {

this.saleTicket();

}

}

// 同步方法默認(rèn)對this加鎖

private synchronized void saleTicket() {

if (count > 0) {

try {

Thread.sleep(3000);

count--;

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println(Thread.currentThread().getName()+"賣出一張票帖池,還剩" + count + "張票");

}

}

}

1.8死鎖【隨意了解一下就行】

線程t1,擁有A資源吭净,再次申請B資源睡汹,線程t2,擁有B資源,再申請A資源攒钳,t1因?yàn)闆]有申請到B資源而進(jìn)入阻塞帮孔;t2因?yàn)闆]有申請到A資源進(jìn)入阻塞。此時兩個線程都處于阻塞狀態(tài)而不能正常結(jié)束,而此時cpu空轉(zhuǎn)文兢,這種情況稱為死鎖晤斩。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市姆坚,隨后出現(xiàn)的幾起案子澳泵,更是在濱河造成了極大的恐慌,老刑警劉巖兼呵,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兔辅,死亡現(xiàn)場離奇詭異,居然都是意外死亡击喂,警方通過查閱死者的電腦和手機(jī)维苔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來懂昂,“玉大人介时,你說我怎么就攤上這事×璞颍” “怎么了沸柔?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長铲敛。 經(jīng)常有香客問我褐澎,道長,這世上最難降的妖魔是什么伐蒋? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任工三,我火速辦了婚禮,結(jié)果婚禮上咽弦,老公的妹妹穿的比我還像新娘徒蟆。我一直安慰自己胁出,他們只是感情好型型,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著全蝶,像睡著了一般闹蒜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上抑淫,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天绷落,我揣著相機(jī)與錄音,去河邊找鬼始苇。 笑死砌烁,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播函喉,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼避归,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了管呵?” 一聲冷哼從身側(cè)響起梳毙,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎捐下,沒想到半個月后账锹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡坷襟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年奸柬,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片婴程。...
    茶點(diǎn)故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡鸟缕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出排抬,到底是詐尸還是另有隱情懂从,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布蹲蒲,位于F島的核電站番甩,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏届搁。R本人自食惡果不足惜缘薛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望卡睦。 院中可真熱鬧宴胧,春花似錦、人聲如沸表锻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瞬逊。三九已至显歧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間确镊,已是汗流浹背士骤。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蕾域,地道東北人拷肌。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親巨缘。 傳聞我的和親對象是個殘疾皇子厢绝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容