協(xié)程的使用

coroutines


kotlin的協(xié)程在kotlin1.3有了很大變化弥鹦。嚣艇。禽翼。

1. 協(xié)程的啟動(building)

啟動協(xié)程的主要兩個方法

fun launch(): Job
fun async(): Deferred

1.1 launch

public fun CoroutineScope.launch(
    context: CoroutineContext = EmptyCoroutineContext,
    start: CoroutineStart = CoroutineStart.DEFAULT,
    block: suspend CoroutineScope.() -> Unit
): Job {
}

launch() 方法接收三個參數(shù)捍壤,通常很少用到第二個參數(shù)续誉。

第一個參數(shù)是一個協(xié)程的上下文,CoroutineContext不僅可以用于在協(xié)程跳轉(zhuǎn)的時刻傳遞數(shù)據(jù)扛吞,同時最主要的功能呻惕,是用于表明協(xié)程運行與恢復時的上下文環(huán)境。具體參數(shù)如下表

CoroutineDispatcher --- 對應的老版kotlin
Default It is backed by a shared pool of threads on JVM. By default, the maximal number of threads used by this dispatcher is equal to the number CPU cores, but is at least two. CommonPool
Main A coroutine dispatcher that is confined to the Main thread operating with UI objects. UI
Unconfined It executes initial continuation of the coroutine immediately in the current call-frame and lets the coroutine resume in whatever thread that is used by the corresponding suspending function, without mandating any specific threading policy. Unconfined
IO The [CoroutineDispatcher] that is designed for offloading blocking IO tasks to a shared pool of threads.

老版本的協(xié)程滥比,通常Android在用的時候都是傳一個UI就表示在 UI 線程啟動協(xié)程亚脆,或者傳一個CommonPool表示在異步啟動協(xié)程,還有一個是Unconfined表示不指定守呜,在哪個線程調(diào)用就在哪個線程恢復型酥。

public fun launch(
    context: CoroutineContext, 
    start: CoroutineStart = CoroutineStart.DEFAULT,
    block: suspend CoroutineScope.() -> Unit
): Job {
}
// CoroutineContext,  不僅可以用于在協(xié)程跳轉(zhuǎn)的時刻傳遞數(shù)據(jù),同時最主要的功能查乒,是用于表明協(xié)程運行與恢復時的上下文環(huán)境弥喉。

1.2 async()方法

async()方法也是創(chuàng)建一個協(xié)程并啟動,甚至連方法的聲明都跟launch()方法一模一樣玛迄。
不同的是由境,async()方法的返回值,返回的是一個Deferred對象蓖议。這個接口是Job接口的子類虏杰。
因此上文介紹的所有方法,都可以用于Deferred的對象勒虾。

Deferred最大的用處在于他特有的一個方法await()

public suspend fun await(): T

await()可以返回當前協(xié)程的執(zhí)行結(jié)果纺阔,也就是你可以這樣寫代碼:

fun main(){
    runBlocking {
        val deferred1 = async(Dispatchers.Default) {
            println(Thread.currentThread())
            "hello1"
        }

        async(Dispatchers.Default){
            println(Thread.currentThread())
            println("hello2")
            println(deferred1.await())
        }

    }
}

你發(fā)現(xiàn)神奇的地方了嗎,我讓一個工作在主線程的協(xié)程修然,獲取到了一個異步協(xié)程的返回值笛钝。
這意味著,我們以后網(wǎng)絡請求愕宋、圖片加載玻靡、數(shù)據(jù)庫、文件操作什么的中贝,都可以丟到一個異步的協(xié)程中去囤捻,然后在同步代碼中直接取返回值,而不再需要去寫回調(diào)了邻寿。
這就是我們經(jīng)常使用的一個最大特性蝎土。

Question 如果采用 GlobalScope啟動協(xié)程會怎么樣视哑?

fun main(){
    runBlocking {
        val deferred1 = async(Dispatchers.Default) {
            println(Thread.currentThread())
            "hello1"
        }

        async(Dispatchers.Default){
            println(Thread.currentThread())
            println("hello2")
            println(deferred1.await())
        }

    }
}
// 運行結(jié)果
Thread[DefaultDispatcher-worker-1,5,main]
Thread[DefaultDispatcher-worker-3,5,main]
hello2
hello1
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市誊涯,隨后出現(xiàn)的幾起案子黎炉,更是在濱河造成了極大的恐慌,老刑警劉巖醋拧,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異淀弹,居然都是意外死亡丹壕,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進店門薇溃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來菌赖,“玉大人,你說我怎么就攤上這事沐序×鹩茫” “怎么了?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵策幼,是天一觀的道長邑时。 經(jīng)常有香客問我,道長特姐,這世上最難降的妖魔是什么晶丘? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮唐含,結(jié)果婚禮上浅浮,老公的妹妹穿的比我還像新娘。我一直安慰自己捷枯,他們只是感情好滚秩,可當我...
    茶點故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著淮捆,像睡著了一般郁油。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上争剿,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天已艰,我揣著相機與錄音,去河邊找鬼蚕苇。 笑死哩掺,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的涩笤。 我是一名探鬼主播嚼吞,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼盒件,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了舱禽?” 一聲冷哼從身側(cè)響起炒刁,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎誊稚,沒想到半個月后翔始,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡里伯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年城瞎,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疾瓮。...
    茶點故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡脖镀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出狼电,到底是詐尸還是另有隱情蜒灰,我是刑警寧澤,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布肩碟,位于F島的核電站强窖,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏削祈。R本人自食惡果不足惜毕骡,卻給世界環(huán)境...
    茶點故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望岩瘦。 院中可真熱鬧未巫,春花似錦、人聲如沸启昧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽密末。三九已至握爷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間严里,已是汗流浹背新啼。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留刹碾,地道東北人燥撞。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親物舒。 傳聞我的和親對象是個殘疾皇子色洞,可洞房花燭夜當晚...
    茶點故事閱讀 44,652評論 2 354

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