官术网_书友最值得收藏!

Using a specific dispatcher when starting the coroutine

So far, we have seen how to create coroutines using async() and launch(), but in both cases we were using the default dispatcher. Consider the following code:

fun main(args: Array<String>) = runBlocking {
val task = launch {
printCurrentThread()
}
task.join()
}

Here, printCurrentThread(), as its name suggests, will just print the name of the current thread to the standard output:

fun printCurrentThread() {
println("Running in thread [${Thread.currentThread().name}]")
}

By running this code, we see that by default the coroutine will run in DefaultDispatcher, which as the time of writing is the same dispatcher as CommonPool – but be aware that this could change in the future.

If we update main() to create a CoroutineDispatcher the same way we did before, and send it to launch(), we will see that the coroutine is being executed in the thread that we indicated, for example:

fun main(args: Array<String>) = runBlocking {
val dispatcher = newSingleThreadContext(name = "ServiceCall")
val task = launch(dispatcher) {
printCurrentThread()
}
task.join()
}

The output looks like the following screenshot. Notice that the name of the thread is the same name that we set for the dispatcher:

Now we will do likewise in MainActivity:

private val dispatcher = newSingleThreadContext(name = "ServiceCall")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
launch(dispatcher) {
// TODO Call coroutine here
}
}
主站蜘蛛池模板: 平顶山市| 嫩江县| 汕尾市| 安多县| 开远市| 灵川县| 连城县| 裕民县| 阳江市| 鸡东县| 河源市| 四子王旗| 边坝县| 冀州市| 贡嘎县| 砀山县| 榆中县| 舒城县| 洪江市| 二连浩特市| 乐业县| 迁西县| 淮北市| 溆浦县| 鹿邑县| 东宁县| 富裕县| 姜堰市| 邳州市| 凤城市| 望都县| 象山县| 新巴尔虎右旗| 济宁市| 驻马店市| 南阳市| 永兴县| 怀宁县| 新宾| 宜兰市| 汕尾市|