android中使用LinkedBlockingQueue,實現(xiàn)線程阻塞宾袜,先進先出的多線程加載

背景:對于客戶端來說經(jīng)常會有多線程的需求,一般為了線程安全會加鎖驾窟,或者使用特殊的集合來處理庆猫,基本會滿足我們的需求。但是有些多線程場景是在特殊環(huán)境下绅络,服務端數(shù)據(jù)源一直發(fā)送處理數(shù)據(jù)到客戶端月培,然后客戶端處理邏輯比較復雜屬于耗時操作,放在主線程會導致界面卡頓恩急,因此會不斷的用子線程來執(zhí)行杉畜,并且對數(shù)據(jù)處理的執(zhí)行順序還必須是先進先出的模式,不然數(shù)據(jù)可能會出現(xiàn)問題衷恭。

需求:

  • 接受到數(shù)據(jù)在子線程中進行處理此叠,處理完數(shù)據(jù)返回主線程改變界面。
  • 數(shù)據(jù)按照接收順序執(zhí)行匾荆,多個數(shù)據(jù)同時執(zhí)行時在前面線程沒有執(zhí)行完成時后面的數(shù)據(jù)進行等待拌蜘,一個一個按照先進先出的順序進行執(zhí)行。

根據(jù)需求首先考慮的就是阻塞隊列BlockingQueue牙丽,經(jīng)過一番對比選用LinkedBlockingQueue來進行實現(xiàn)简卧。
LinkedBlockingQueue在安卓中的實現(xiàn)和在java中的實現(xiàn)不太一樣,考慮到子線程處理主線程顯示的邏輯烤芦,網(wǎng)上參考了比較多其他的博客举娩,后面才有了下面的處理

1.首先創(chuàng)建LinkedBlockingQueue

private val linkedBlockingQueue = LinkedBlockingQueue<T>()

2.接受服務器push過來的數(shù)據(jù),并且保存進LinkedBlockingQueue

linkedBlockingQueue.put(T)

3.在啟動類的時候通過rxjava開啟子線程獲取LinkedBlockingQueue中排隊的數(shù)據(jù)進行處理,處理完成后返回主線程進行操作

init {
        addSubscribe(Flowable.interval(0, 500, TimeUnit.MILLISECONDS)
                .flatMap {
                    //獲取的方法poll铜涉,如果生產(chǎn)者沒有數(shù)據(jù)智玻,那么這里的消費者拿到的數(shù)據(jù)是為null,需要做判斷
                        var T = linkedBlockingQueue.poll()  
                        Flowable.just(update(T))   //處理邏輯
                }
                .compose(RxUtils.rxSchedulerHelper())//rxjava線程切換
                .subscribe({
                        mView?.showView(data)
                }, {}))
    }


LinkedBlockingQueue的基本方法講解:

LinkedBlockingQueue構造的時候若沒有指定大小芙代,則默認大小為Integer.MAX_VALUE吊奢,當然也可以在構造函數(shù)的參數(shù)中指定大小。LinkedBlockingQueue不接受null纹烹。

  • 添加元素的方法有三個:add页滚,put,offer铺呵。
    add :方法在添加元素的時候裹驰,若超出了度列的長度會直接拋出異常:
    put :方法,若向隊尾添加元素的時候發(fā)現(xiàn)隊列已經(jīng)滿了會發(fā)生阻塞一直等待空間片挂,以加入元素幻林。
    offer :方法在添加元素時,如果發(fā)現(xiàn)隊列已滿無法添加的話音念,會直接返回false沪饺。

  • 從隊列中取出并移除頭元素的方法有:poll,remove症昏,take随闽。
    poll :若隊列為空,返回null肝谭。
    remove :若隊列為空掘宪,拋出NoSuchElementException異常。
    take :若隊列為空攘烛,發(fā)生阻塞魏滚,等待有元素。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末坟漱,一起剝皮案震驚了整個濱河市鼠次,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌芋齿,老刑警劉巖腥寇,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異觅捆,居然都是意外死亡赦役,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門栅炒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來掂摔,“玉大人术羔,你說我怎么就攤上這事∫依欤” “怎么了级历?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長叭披。 經(jīng)常有香客問我寥殖,道長,這世上最難降的妖魔是什么涩蜘? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任扛禽,我火速辦了婚禮,結果婚禮上皱坛,老公的妹妹穿的比我還像新娘。我一直安慰自己豆巨,他們只是感情好剩辟,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著往扔,像睡著了一般贩猎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上萍膛,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天吭服,我揣著相機與錄音,去河邊找鬼蝗罗。 笑死艇棕,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的串塑。 我是一名探鬼主播沼琉,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼桩匪!你這毒婦竟也來了打瘪?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤傻昙,失蹤者是張志新(化名)和其女友劉穎闺骚,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體妆档,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡僻爽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了过吻。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片进泼。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡蔗衡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出乳绕,到底是詐尸還是另有隱情绞惦,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布洋措,位于F島的核電站济蝉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏菠发。R本人自食惡果不足惜王滤,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望滓鸠。 院中可真熱鬧雁乡,春花似錦、人聲如沸糜俗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽悠抹。三九已至珠月,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間楔敌,已是汗流浹背啤挎。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留卵凑,地道東北人庆聘。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像氛谜,于是被迫代替她去往敵國和親掏觉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350