經常使用調度器
調度器 |
描述 |
缺省的 |
等待被調度,運行在當前線程上 |
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")
}
複製代碼
微信公衆號