記錄一次線上多線程問題

多線程主線程與子線程執(zhí)行順序問題

案發(fā)現(xiàn)場

image.png

上述代碼目標(biāo)是完成在庫600w微信公眾號會員數(shù)據(jù)的清洗媒峡,通過jdbc游標(biāo)一次性從從庫中拿出所有數(shù)據(jù),游標(biāo)while循環(huán)遍歷組裝一個100位的數(shù)組证杭,并通過多線程去拿著這個數(shù)組完成后續(xù)操作徽职;

期望如下圖:


image.png

但是VΦ蕖!實際結(jié)果


image.png

在線程池執(zhí)行數(shù)組拼裝的時候熔吗,每一個線程執(zhí)行的都是當(dāng)前第一個100頁的數(shù)組(ps:后來得知真實情況是線程并不是每次都是執(zhí)行第一次辆床,而是看運氣可能會執(zhí)行前面線程執(zhí)行過的數(shù)組,純看cpu資源搶占的運氣)
因為清洗數(shù)據(jù)都是大半夜開始執(zhí)行桅狠,當(dāng)跑到大半夜的時候發(fā)現(xiàn)問題讼载,立即停掉服務(wù)定位問題;中間一直走過許多彎路垂攘,首先考慮的是數(shù)據(jù)結(jié)構(gòu)為非線程安全维雇,花了大量力氣把a(bǔ)rrayBuffer換成其他安全數(shù)據(jù)結(jié)構(gòu),但是依然無果晒他,各種無果情況下吱型,特在此特別鳴謝 遠(yuǎn)在深圳前領(lǐng)導(dǎo)老王-祥哥,在他指導(dǎo)下陨仅,迅速定位問題津滞,照搬代碼(照搬過程中其實也是不知其所以然,只為解決問題灼伤。触徐。。狐赡。)解決當(dāng)下問題撞鹉;

附上修改之后代碼如下:


image.png

上述代碼運行如下:


image.png

可以看到經(jīng)過修改之后代碼正確按照期望運行,每次游標(biāo)組裝100個arrayBuffer之后開啟多線程異步去處理颖侄,主線程繼續(xù)遍歷下一頁的arrayBuffer鸟雏,且每個線程數(shù)據(jù)不會亂

相比較兩者差異可以發(fā)現(xiàn),唯一經(jīng)過改動的代碼為

    if (arrayBuffer.length == 99) {
      val asList = arrayBuffer.toList
      exec.execute(()=>{
        logger.info(s"子線程開始請求${asList}")
      })
      logger.info(s"主線程開始${arrayBuffer}")
      arrayBuffer.clear()
    }

每次arraybuffer.toList()方法放到了線程池之外的主線程去執(zhí)行览祖,子線程則每次執(zhí)行最新的arrayBuffer

問題原因:線程池多線程執(zhí)行過程中主線程與子線程執(zhí)行順序問題:
在線程池開啟時孝鹊,其實背后做的是mainThread中從線程池拿到線程資源開啟子線程異步 去執(zhí)行線程池excute()函數(shù)方法,因為在多線程處理情況過程中展蒂,主線程因為已經(jīng)開始執(zhí)行又活,當(dāng)前是霸占了cpu資源的苔咪,而線程池中線程為mainThread線程中的子線程,子線程的執(zhí)行順序是低于main主線程的柳骄,所以當(dāng)主線程拿到cpu資源之后团赏,子線程會去拿cpu資源時,是低于主線程的耐薯,所以導(dǎo)致arrayBuffer.toList是子線程去操作的馆里,也就是都會優(yōu)先去執(zhí)行主線程中的 arrayBuffer.clear();這樣子線程中永遠(yuǎn)在跟主線程搶占資源的時候偶爾會出現(xiàn)上述代碼中執(zhí)行前面一條線程的arrayBuffer;

剛開始時可柿,只有主線程在使用CPU的執(zhí)行權(quán),因為其他兩個線程還沒有被創(chuàng)建丙者,這時主線程的代碼就自上而下的去執(zhí)行复斥。
當(dāng)主線程的內(nèi)容執(zhí)行完畢后,就開始創(chuàng)建并啟動其他的線程械媒,此時目锭,棧中有三個線程:主線程、Thread-0和Thread-1線程(上述demo中只開啟了兩個)纷捞。但是主線程中的arrayBuffer最后toList()是在子線程去執(zhí)行的痢虹,所以現(xiàn)在相當(dāng)于只有Thread-0和Thread-1線程搶資源情況都會去執(zhí)行主線程中arrayBuffer1,而不是我們要求的t1 =>arraybuffer1主儡,t2 =>arraybuffer2奖唯,因此我們會看到這兩個線程在輪流搶占CPU的執(zhí)行權(quán)且都在執(zhí)行arraybuffer1

基于上述原理,所以我們要做的核心目的是讓子線程每次執(zhí)行的都是最新的arrayBuffer糜值,

      val asList = arrayBuffer.toList

所以老司機(jī)的建議做法吧arraybuffer的toList()從子線程參數(shù)放到main主線程中(因為arrayBuffer.clear在主線程中執(zhí)行丰捷,他是優(yōu)先執(zhí)行的)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市寂汇,隨后出現(xiàn)的幾起案子病往,更是在濱河造成了極大的恐慌,老刑警劉巖骄瓣,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件停巷,死亡現(xiàn)場離奇詭異,居然都是意外死亡榕栏,警方通過查閱死者的電腦和手機(jī)畔勤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來臼膏,“玉大人硼被,你說我怎么就攤上這事∩酰” “怎么了嚷硫?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵检访,是天一觀的道長。 經(jīng)常有香客問我仔掸,道長脆贵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任起暮,我火速辦了婚禮卖氨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘负懦。我一直安慰自己筒捺,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布纸厉。 她就那樣靜靜地躺著系吭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪颗品。 梳的紋絲不亂的頭發(fā)上肯尺,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機(jī)與錄音躯枢,去河邊找鬼则吟。 笑死,一個胖子當(dāng)著我的面吹牛锄蹂,可吹牛的內(nèi)容都是我干的氓仲。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼得糜,長吁一口氣:“原來是場噩夢啊……” “哼寨昙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起掀亩,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤舔哪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后槽棍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捉蚤,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年炼七,在試婚紗的時候發(fā)現(xiàn)自己被綠了缆巧。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡豌拙,死狀恐怖陕悬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情按傅,我是刑警寧澤捉超,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布胧卤,位于F島的核電站,受9級特大地震影響拼岳,放射性物質(zhì)發(fā)生泄漏枝誊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一惜纸、第九天 我趴在偏房一處隱蔽的房頂上張望叶撒。 院中可真熱鬧,春花似錦耐版、人聲如沸祠够。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽哪审。三九已至,卻和暖如春虑瀑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背滴须。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工舌狗, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人扔水。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓痛侍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親魔市。 傳聞我的和親對象是個殘疾皇子主届,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

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