Kotlin Channel學(xué)習(xí)

channel用于協(xié)程之間的通訊您单,使用send和receive往通道里寫入或者讀取數(shù)據(jù)梯投,2個(gè)方法為非阻塞掛起函數(shù)稻薇,channel是熱流押桃,不管有沒有訂閱者都會發(fā)送葵萎。

Channel的簡單使用


       val channel = Channel<Int>()
        launch {

            channel.send(111)

        }


        launch {

            println("receive:" + channel.receive())

        }

打印 receive:111

Channel 默認(rèn)是0容量的buffer

send是個(gè)掛起函數(shù),發(fā)送到通道唱凯,如果通道buffer已滿羡忘,就會掛起調(diào)用者

例如:

val channel = Channel<Int>()
        launch {

            channel.send(111)
            println("sendbefore:222")
            channel.send(222)
            println("sendafter:222")
            channel.send(333)

        }


        launch {

            println("receive:" + channel.receive())

        }

打印
receive:111
sendbefore:222

channel.send(222) 發(fā)送到通道后,通道滿了磕昼,調(diào)用者的協(xié)程被掛起卷雕,所以 println("sendafter:222")不執(zhí)行了

recevie調(diào)用時(shí),如果通道里不為空票从,就從通道里把元素拿出來漫雕,并且從通道里移除元素,如果通道元素為空峰鄙,則掛起調(diào)用者浸间,等通道有元素后 才會執(zhí)行

例如

    val channel = Channel<Int>()
        launch {

            delay(5000)
            channel.send(111)

        }


        launch {
            println("receive:before")
            println("receive:" + channel.receive())
            println("receive:after")
        }

打印

2022-08-17 16:21:24.918 7723-7723/com.kemai.myapplication I/System.out: receive:before
2022-08-17 16:21:29.924 7723-7723/com.kemai.myapplication I/System.out: receive:111
2022-08-17 16:21:29.924 7723-7723/com.kemai.myapplication I/System.out: receive:after


receive:before和 receive:111 間隔了5秒

receive時(shí) 通道里沒有元素,被掛起吟榴,5秒后發(fā)送了元素魁蒜,繼續(xù)執(zhí)行

Channel迭代獲取

lifecycleScope.launch {


            channel.send(1)
            channel.send(2)


        }

 lifecycleScope.launch {



            for(x in channel){

                println(x)
            }

            println("receive:end" )

        }


打印
1
2

接受者一直在等待,所以不打印 receive end

在send完畢后,調(diào)用channel.close即可執(zhí)行完畢兜看,打印receive end

Channel的四種類型

Rendezvous channel(默認(rèn)類型): 0尺寸buffer锥咸,send是個(gè)掛起函數(shù),發(fā)送到通道铣减,如果通道buffer已滿她君,就會掛起調(diào)用者,這個(gè)0buffer葫哗,發(fā)送一個(gè)缔刹,如果沒人接收,調(diào)用者就被掛起

Buffered channel:指定元素大小劣针,發(fā)送當(dāng)buffer滿了后Send會被掛起校镐。

Conflated channel: 新元素會覆蓋舊元素,receiver只會得到最新元素捺典,Send永不掛起鸟廓。

Unlimited channel: buffer無限,Send不被掛起襟己。

例子:

1 Rendezvous channe

 val rendezvousChannel = Channel<Int>(Channel.RENDEZVOUS)

  lifecycleScope.launch {


            rendezvousChannel.send(1)
            println("after send 1111")
            rendezvousChannel.send(2)
            println("after send 2222")

        }

        lifecycleScope.launch {

            println(rendezvousChannel.receive())
            println("receive:end")

        }
        //打印1  
        //receive:end
        //after send 1111
        
        //rendezvousChannel 發(fā)送了1后引谜,接受了1,繼續(xù)發(fā)送2擎浴,因?yàn)閎uffer是0员咽,所以滿了,2沒人接收贮预,所以調(diào)用者被掛起贝室,沒有打印after send 2222

2 Buffered channel
 val bufferedChannel = Channel<Int>(2)
 lifecycleScope.launch {


            bufferedChannel.send(1)
            println("after send 1111")
            bufferedChannel.send(2)
            println("after send 2222")
            bufferedChannel.send(3)
            println("after send 3333")
            bufferedChannel.send(4)
            println("after send 4444")

        }

        lifecycleScope.launch {

            println(bufferedChannel.receive())

            println("receive:end")

        }
        //打印
        //after send 1111
        //after send 2222
        //1
        //receive:end
        //after send 3333
        //bufferedChannel(2) 發(fā)送了1后,接受了1仿吞,繼續(xù)發(fā)送2 3 4滑频,因?yàn)閎uffer是2,發(fā)送了2和3后唤冈,所以滿了峡迷,2沒人接收,所以調(diào)用者被掛起你虹,沒有打印after send 4444

3 Conflated channel
 val conflatedChannel = Channel<Int>(Channel.CONFLATED)

 lifecycleScope.launch {

            for (x in 1..10) {

                conflatedChannel.send(x)
            }

        }

        lifecycleScope.launch {

            println(conflatedChannel.receive())

            println("receive:end")

        }
        //打印10 只會接收最新值  但是在2次send之間delay1毫秒凉当,會取第一次的,應(yīng)該機(jī)制是send被掛起之前的最新值售葡,掛起后 就算另外一批次的發(fā)送了

4 Unlimited channel
  val unlimitedChannel = Channel<Int>(Channel.UNLIMITED)

   lifecycleScope.launch {

            for (x in 1..10) {

                unlimitedChannel.send(x)
                println(x)
            }

        }

        lifecycleScope.launch {

            println(unlimitedChannel.receive())
            println(unlimitedChannel.receive())
            println("receive:end")

        }
        //打印send 1-10 只會接收最新值 receive 1-2 receive end, send方法不會掛起看杭,因?yàn)閎uffer無限大,不會被填滿

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末挟伙,一起剝皮案震驚了整個(gè)濱河市楼雹,隨后出現(xiàn)的幾起案子模孩,更是在濱河造成了極大的恐慌,老刑警劉巖贮缅,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件榨咐,死亡現(xiàn)場離奇詭異,居然都是意外死亡谴供,警方通過查閱死者的電腦和手機(jī)块茁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來桂肌,“玉大人数焊,你說我怎么就攤上這事∑槌。” “怎么了佩耳?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長谭跨。 經(jīng)常有香客問我干厚,道長,這世上最難降的妖魔是什么螃宙? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任蛮瞄,我火速辦了婚禮,結(jié)果婚禮上谆扎,老公的妹妹穿的比我還像新娘聘裁。我一直安慰自己烟馅,他們只是感情好陨帆,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布掀虎。 她就那樣靜靜地躺著差油,像睡著了一般抚笔。 火紅的嫁衣襯著肌膚如雪崭参。 梳的紋絲不亂的頭發(fā)上整慎,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天声诸,我揣著相機(jī)與錄音酱讶,去河邊找鬼。 笑死彼乌,一個(gè)胖子當(dāng)著我的面吹牛泻肯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播慰照,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼灶挟,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了毒租?” 一聲冷哼從身側(cè)響起稚铣,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后惕医,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體耕漱,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年抬伺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了螟够。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,427評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡峡钓,死狀恐怖妓笙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情椒楣,我是刑警寧澤给郊,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站捧灰,受9級特大地震影響淆九,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜毛俏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一炭庙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧煌寇,春花似錦焕蹄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至银锻,卻和暖如春永品,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背击纬。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工鼎姐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人更振。 一個(gè)月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓炕桨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親肯腕。 傳聞我的和親對象是個(gè)殘疾皇子献宫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評論 2 359

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