给定
所以doNetworkCall1()必须在doNetworkCall2()开始之前执行,doNetworkCall3()必须在doNetworkCall4()开始之前执行,但是不知道doNetworkCall1()或doNetworkCall3()哪个先运行,因为协程不会阻塞线程,特别是线程1。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
GlobalScope.launch {
doNetworkCall()
doNetworkCall2()
}
}
suspend fun doNetworkCall() {
delay(3000)
Log.d("TRACE", "doNetworkCall1 in ${Thread.currentThread().name}")
}
suspend fun doNetworkCall2() {
delay(3000)
Log.d("TRACE", "doNetworkCall2 in ${Thread.currentThread().name}")
}
结果是睡眠3秒钟,然后打印"在DefaultDispatcher-worker-1中的doNetworkCall1",再睡眠3秒钟,然后打印"在DefaultDispatcher-worker-1中的doNetworkCall2"。
根据延迟的Javadoc,"延迟协程一段时间而不阻塞线程"。
在我的例子中,我启动了一个协程。这个协程被延迟了两次,首先在打印"doNetworkCall1..."之前延迟3秒钟,然后在打印"doNetworkCall2..."之前延迟。但是我们在同一个线程worker-1中,很明显这个线程被阻塞了,因为这些日志是按顺序打印的。
另外,假设我有一种方法可以在这个协程之后启动另一个在同一个线程(线程1)上运行的协程。第二个协程不会等待第一个协程,对吗?换句话说,虽然协程体内的代码按顺序执行,但是不同协程之间的调用是异步执行的,即无序执行。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
GlobalScope.launch {
doNetworkCall()
doNetworkCall2()
}
// pretend this runs in the same thread as coroutine 1, I just dont know how to do that
GlobalScope.launch {
doNetworkCall3()
doNetworkCall4()
}
}
suspend fun doNetworkCall() {
delay(3000)
Log.d("TRACE", "doNetworkCall1 in
${Thread.currentThread().name}")
}
suspend fun doNetworkCall2() {
delay(3000)
Log.d("TRACE", "doNetworkCall2 in
${Thread.currentThread().name}")
}
所以doNetworkCall1()必须在doNetworkCall2()开始之前执行,doNetworkCall3()必须在doNetworkCall4()开始之前执行,但是不知道doNetworkCall1()或doNetworkCall3()哪个先运行,因为协程不会阻塞线程,特别是线程1。