協程入門(三):調度器

經常使用調度器

調度器 描述
缺省的 等待被調度,運行在當前線程上
Default 等待被調度,運行新的線程上
Main 等待被調度,運行在UI線程上
IO 等待被調度,運行新的線程上,適合IO操做
Unconfined 當即被調度執行,運行在當前線程上

示例

缺省

/**
     * 缺省的調度器是空的,默認運行在當前線程上
     *
     * 打印出:
     *
     * runBlocking thread = Instr: android.support.test.runner.AndroidJUnitRunner,1397
     * runBlocking end
     * launch thread = Instr: android.support.test.runner.AndroidJUnitRunner,1397
     */
    @Test
    fun dispatcher() = runBlocking {
        println(" runBlocking thread = ${Thread.currentThread().name},${Thread.currentThread().id}")
        launch {
            println(" launch thread = ${Thread.currentThread().name},${Thread.currentThread().id}")
        }
        println(" runBlocking end")
        delay(3000)
    }
複製代碼

default

/**
     * 使用default調度器(注意和缺省的不同),會另起新線程執行協程體內容
     *
     * 打印出:
     *
     * runBlocking thread = Instr: android.support.test.runner.AndroidJUnitRunner,1437
     * runBlocking end
     * default thread = DefaultDispatcher-worker-2,1440
     * runBlocking end2
     * default end
     */
    @Test
    fun dispatcherDefault() = runBlocking {
        println(" runBlocking thread = ${Thread.currentThread().name},${Thread.currentThread().id}")
        launch(Dispatchers.Default) {
            println(" default thread = ${Thread.currentThread().name},${Thread.currentThread().id}")
            //由於是新線程,因此sleep不影響runBlocking end2輸出
            Thread.sleep(10000)
            println(" default end")
        }
        println(" runBlocking end")
        //不一樣線程,sleep不會致使launch也跟着等待
        Thread.sleep(3000)
        println(" runBlocking end2")
    }
複製代碼

main

/**
     *
     * main調度器會在主線程執行協程體內容
     *
     *
     * 輸出:
     *
     * runBlocking thread = Instr: android.support.test.runner.AndroidJUnitRunner,1457
     * runBlocking end
     * main thread = main,1
     */
    @Test
    fun dispatcherMain() = runBlocking {
        println(" runBlocking thread = ${Thread.currentThread().name},${Thread.currentThread().id}")
        launch(Dispatchers.Main) {
            println(" main thread = ${Thread.currentThread().name},${Thread.currentThread().id}")
        }
        println(" runBlocking end")
    }
複製代碼

IO

/**
     * 使用io調度器,和default相似會另起新線程執行協程體內容,只是更適合於密集的io操做
     *
     * 打印出:
     *
     * runBlocking thread = Instr: android.support.test.runner.AndroidJUnitRunner,1477
     * runBlocking end
     * IO thread = DefaultDispatcher-worker-2,1480
     * runBlocking end2
     * IO end
     */
    @Test
    fun dispatcherIO() = runBlocking {
        println(" runBlocking thread = ${Thread.currentThread().name},${Thread.currentThread().id}")
        launch(Dispatchers.IO) {
            println(" IO thread = ${Thread.currentThread().name},${Thread.currentThread().id}")
            //由於是新線程,因此sleep不影響runBlocking end2輸出
            Thread.sleep(10000)
            println(" IO end")
        }
        println(" runBlocking end")
        //不一樣線程,sleep不會致使launch也跟着等待
        Thread.sleep(3000)
        println(" runBlocking end2")
    }
複製代碼

Unconfined

/**
     * 使用Unconfined調度器,會當即在當前線程執行協程體內容,是目前調度器中惟一會堵塞當前線程的
     *
     * 打印出:
     *
     * runBlocking thread = Instr: android.support.test.runner.AndroidJUnitRunner,1482
     * Unconfined thread = Instr: android.support.test.runner.AndroidJUnitRunner,1482
     * Unconfined end
     * runBlocking end
     * runBlocking end2
     * IO end
     */
    @Test
    fun dispatcherUnconfined() = runBlocking {
        println(" runBlocking thread = ${Thread.currentThread().name},${Thread.currentThread().id}")
        launch(Dispatchers.Unconfined) {
            println(" Unconfined thread = ${Thread.currentThread().name},${Thread.currentThread().id}")
            Thread.sleep(10000)
            println(" Unconfined end")
        }
        //相同線程,須要等待Unconfined執行完畢才能夠接着往下執行
        println(" runBlocking end")
        //
        Thread.sleep(3000)
        println(" runBlocking end2")
    }
複製代碼

微信公衆號

相關文章
相關標籤/搜索