2020-03-12多線程

CPU同一個時刻執(zhí)行一個程序劫笙,一個進(jìn)程中可能出現(xiàn)多條執(zhí)行路徑,也就是線程沼撕。

線程是進(jìn)程的控制單元,是進(jìn)程中真正執(zhí)行的部分张峰。線程控制進(jìn)程的執(zhí)行。一個進(jìn)程至少有一個線程負(fù)責(zé)程序的執(zhí)行棒旗,而且這個線程運(yùn)行的代碼存在于main中喘批,稱為主線程。

其實jvm啟動不止一個線程铣揉,還有負(fù)責(zé)垃圾回收機(jī)制的線程饶深,是多線程的。


Thread類:程序中的執(zhí)行線程逛拱。允許程序并發(fā)運(yùn)行多個線程

創(chuàng)建線程:1.繼承Thread類敌厘,覆蓋run方法,創(chuàng)立新對象等于創(chuàng)建好一個線程朽合,啟動線程則調(diào)用start方法(啟動線程俱两,調(diào)用run方法

在一個進(jìn)程中CPU也要進(jìn)行線程的切換饱狂,搶到CPU執(zhí)行權(quán)就先執(zhí)行。運(yùn)行結(jié)果每一次都不同锋华,因為多個線程都獲取cpu的執(zhí)行權(quán)嗡官,在某一時刻只能有一個程序在運(yùn)行(單核)箭窜。


run方法定義了一個功能毯焕,用于儲存線程要運(yùn)行的代碼。虛擬機(jī)定義主線程要調(diào)用的代碼在main方法中磺樱。


復(fù)寫run的目的是:將自定義代碼存儲在run方法中纳猫,讓線程運(yùn)行。而start的功能是啟動線程并調(diào)用run竹捉。僅僅使用run是封裝線程執(zhí)行的代碼芜辕,即使線程創(chuàng)建了卻沒有運(yùn)行線程。

static Thread currentThread():獲取當(dāng)前線程對象

getName():獲取線程名稱

線程名稱:setName或用構(gòu)造函數(shù)傳入

局部變量在每一個線程內(nèi)存中都有獨(dú)立的一份块差。


多線程例子:售票侵续,多窗口賣票

runnable接口:創(chuàng)建線程的第二種方式

1.定義類實現(xiàn)runnable接口

2.覆蓋runnable中的run方法:線程要運(yùn)行的代碼

3.通過Thread類建立線程對象

4.將runnable接口的子類對象作為Thread的參數(shù)傳遞其構(gòu)造函數(shù)(因為run方法所屬的對象是Runnable類,讓線程指定對象的run方法憨闰,就必須明確run方法的對象)

5.調(diào)用Thread類的start方法并開啟線程状蜗、調(diào)用runnable接口子類的run方法


實現(xiàn)方式和繼承方式的區(qū)別:實現(xiàn)方式使多線程成為擴(kuò)展功能,避免了單繼承局限性鹉动。而繼承之后該類就不能成為其他類的子類轧坎。繼承thread:線程代碼存放在Thread的子類中,而runnable代碼存放在接口的子類的run方法中泽示。

安全隱患:多線程可能會跳過判斷而出現(xiàn)不合理的結(jié)果缸血,需要停一下⌒瞪福可能測試不出問題捎泻,但是實際運(yùn)行出現(xiàn)問題。

try{Thread.sleep(10);} catch(Exception e){? }

注意:實現(xiàn)接口的方法的異常不能throw埋哟,只能try族扰。

問題原因:當(dāng)多條語句在操作同一個線程共享數(shù)據(jù)時,一個線程對多條語句只執(zhí)行一部分定欧,但是另一個線程參與進(jìn)來執(zhí)行渔呵,導(dǎo)致共享數(shù)據(jù)的錯誤。

解決辦法:對多條操作共享數(shù)據(jù)的語句砍鸠,只能一個線程執(zhí)行完扩氢,再執(zhí)行過程中其他線程。

同步代碼塊:

synchronized(對象)

????{需要被同步的代碼爷辱,也就是操作共享數(shù)據(jù)的語句}

鎖:對象有兩個標(biāo)志位0,1录豺,當(dāng)0線程獲得執(zhí)行權(quán)就判斷標(biāo)志位朦肘。如果是1,就進(jìn)入代碼双饥,將1變成0媒抠,執(zhí)行代碼塊。執(zhí)行完后又把標(biāo)志位改1咏花。對象如同鎖趴生,持有鎖的線程可以在同步中執(zhí)行。沒有鎖的線程即使獲取cpu執(zhí)行權(quán)也進(jìn)不去昏翰,因為沒有鎖苍匆。

同步的前提:必須要有多個線程;必須的多個線程使用同一個鎖棚菊;必須保證同步中只能有一個線程進(jìn)行浸踩。

好處:解決多線程安全問題;弊端:判斷消耗資源


找問題:明確哪些代碼是多線程運(yùn)行代碼统求;明確共享數(shù)據(jù)检碗;明確多線程中哪些語句操作共享數(shù)據(jù);

同步函數(shù):修飾符synchronized修飾函數(shù)起到同步效果

可以將有需要的代碼變成函數(shù)封裝成同步函數(shù)码邻。

函數(shù)需要被對象調(diào)用折剃,同步函數(shù)的鎖是this

多線程中還有主線程,可能會啟動其他線程并操作共享數(shù)據(jù)冒滩,從而影響了一開始啟動的線程微驶。可以讓主線程先sleep一下开睡。實例中使用了兩種不同的同步:同步函數(shù)和同步代碼塊因苹。因為兩個方式的鎖不一致,所以出現(xiàn)了錯誤篇恒。


靜態(tài)同步函數(shù):靜態(tài)同步函數(shù)所用的鎖不是this扶檐,類要先封裝成對象(字節(jié)碼文件對象)該對象的類型是class,鎖是該方法所在類對應(yīng)的字節(jié)碼文件對象胁艰。

死鎖

同步中嵌套同步款筑,144,一個線程同步中拿著A對象想要調(diào)用B對象腾么,而另一個線程同步中拿著B對象想要調(diào)用A對象

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末奈梳,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子解虱,更是在濱河造成了極大的恐慌攘须,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件殴泰,死亡現(xiàn)場離奇詭異于宙,居然都是意外死亡浮驳,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進(jìn)店門捞魁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來至会,“玉大人,你說我怎么就攤上這事谱俭》罴” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵旺上,是天一觀的道長瓶蚂。 經(jīng)常有香客問我糖埋,道長宣吱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任瞳别,我火速辦了婚禮征候,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘祟敛。我一直安慰自己疤坝,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布馆铁。 她就那樣靜靜地躺著跑揉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪埠巨。 梳的紋絲不亂的頭發(fā)上历谍,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天,我揣著相機(jī)與錄音辣垒,去河邊找鬼望侈。 笑死,一個胖子當(dāng)著我的面吹牛勋桶,可吹牛的內(nèi)容都是我干的脱衙。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼例驹,長吁一口氣:“原來是場噩夢啊……” “哼捐韩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鹃锈,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤荤胁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后仪召,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寨蹋,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡松蒜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了已旧。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秸苗。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖运褪,靈堂內(nèi)的尸體忽然破棺而出惊楼,到底是詐尸還是另有隱情,我是刑警寧澤秸讹,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布檀咙,位于F島的核電站,受9級特大地震影響璃诀,放射性物質(zhì)發(fā)生泄漏弧可。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一劣欢、第九天 我趴在偏房一處隱蔽的房頂上張望棕诵。 院中可真熱鬧,春花似錦凿将、人聲如沸校套。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽笛匙。三九已至,卻和暖如春犀变,著一層夾襖步出監(jiān)牢的瞬間妹孙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工弛作, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留涕蜂,地道東北人。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓映琳,卻偏偏與公主長得像机隙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子萨西,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,092評論 2 355

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

  • 本文主要講了java中多線程的使用方法有鹿、線程同步、線程數(shù)據(jù)傳遞谎脯、線程狀態(tài)及相應(yīng)的一些線程函數(shù)用法葱跋、概述等。 首先講...
    李欣陽閱讀 2,456評論 1 15
  • Java多線程學(xué)習(xí) [-] 一擴(kuò)展javalangThread類 二實現(xiàn)javalangRunnable接口 三T...
    影馳閱讀 2,959評論 1 18
  • 1.1 多線程介紹 學(xué)習(xí)多線程之前,我們先要了解幾個關(guān)于多線程有關(guān)的概念娱俺。 進(jìn)程:進(jìn)程指正在運(yùn)行的程序稍味。確切的來說...
    Pecksniff1994閱讀 1,559評論 0 2
  • 林炳文Evankaka原創(chuàng)作品。轉(zhuǎn)載自http://blog.csdn.net/evankaka 本文主要講了ja...
    ccq_inori閱讀 654評論 0 4
  • 三荠卷、多線程: 1模庐、進(jìn)程和線程: 進(jìn)程:正在進(jìn)行的程序。每一個進(jìn)程執(zhí)行都有一個執(zhí)行順序油宜,該順序是一個執(zhí)行路徑掂碱,或者叫...
    佘大將軍閱讀 298評論 0 0