fun main() {
println("1start----------" + Thread.currentThread())
runBlocking() {
println("2runBlocking----------" + Thread.currentThread())
println("3runBlocking----------this.toString()=" + this.toString())
this.launch {
delay(1000)
println("6world " + Thread.currentThread())
launch {
delay(500)
println("8hello第2层 " + Thread.currentThread())
}
println("7hello11111111111 " + Thread.currentThread())
delay(5000)
}
println("4测试顺序 " + Thread.currentThread())
println("5end----------" + Thread.currentThread())
}
println("9end----------" + Thread.currentThread())
}
1start----------Thread[main,5,main]
2runBlocking----------Thread[main,5,main]
3runBlocking----------this.toString()=BlockingCoroutine{Active}@6325a3ee
4测试顺序 Thread[main,5,main]
5end----------Thread[main,5,main]
6world Thread[main,5,main]
7hello11111111111 Thread[main,5,main]
8hello第2层 Thread[main,5,main]
9end----------Thread[main,5,main]
runBlocking 内部代码块执行完毕,才会执行后面的代码,阻塞当前的线程。
fun main() {
println("1start----------" + Thread.currentThread())
runBlocking(context = kotlinx.coroutines.Dispatchers.IO) {
println("2runBlocking----------" + Thread.currentThread())
println("3runBlocking----------this.toString()=" + this.toString())
runBlocking {
delay(1000)
println("6world " + Thread.currentThread())
launch {
delay(500)
println("8hello第2层 " + Thread.currentThread())
}
println("7hello11111111111 " + Thread.currentThread())
delay(5000)
}
println("4测试顺序 " + Thread.currentThread())
println("5end----------" + Thread.currentThread())
}
println("9end----------" + Thread.currentThread())
}
1start----------Thread[main,5,main]
2runBlocking----------Thread[DefaultDispatcher-worker-2,5,main]
3runBlocking----------this.toString()=BlockingCoroutine{Active}@6728c30
6world Thread[DefaultDispatcher-worker-2,5,main]
7hello11111111111 Thread[DefaultDispatcher-worker-2,5,main]
8hello第2层 Thread[DefaultDispatcher-worker-2,5,main]
4测试顺序 Thread[DefaultDispatcher-worker-2,5,main]
5end----------Thread[DefaultDispatcher-worker-2,5,main]
9end----------Thread[main,5,main]
内部也阻塞了,按照顺序执行
多个子协程并发,不阻塞的方式
fun main() {
runBlocking {
// val job =
launch {
delay(2000)
println("4hello world")
}
launch {
// delay(1000)
println("3hello world")
}
println("1hello")
// job.join()
println("2done")
}
println("end done")
}
方法2
suspend fun doWorld4() = coroutineScope {
///coroutineScope{}可以在suspend暂停函数中执行并发操作
//比如开启多个launch{} ,多个协程运行完,coroutineScope{}才结束
launch {
delay(2000L)///delay() 是一个特殊的暂停or悬挂函数
println("World 2")
}
println("doWorld4 ---------------分割")
launch {
delay(4000L)
println("World 1")
}
println("doWorld4 Hello")
}
fun main() {
println("main runBlocking ")
runBlocking {
println("start runBlocking ")
doWorld4()
println("end runBlocking ")
}
println("main runBlocking ")
}
阻塞写法 withContext
fun main() {
GlobalScope.launch {
withContext(kotlinx.coroutines.Dispatchers.IO){
delay(3000)
println("2 withContext")
}
println("222 withContext")
withContext(kotlinx.coroutines.Dispatchers.IO){
delay(100)
println("1 withContext")
}
println("111 withContext")
}
Thread.sleep(5555)
println("end withContext")
}
2 withContext
222 withContext
1 withContext
111 withContext
end withContext
异步async
fun main() {
GlobalScope.launch {
async(kotlinx.coroutines.Dispatchers.IO){
delay(3000)
println("2 withContext")
}
println("22 withContext")
async(kotlinx.coroutines.Dispatchers.IO){
delay(100)
println("1 withContext")
}
println("111 withContext")
}
Thread.sleep(5555)
println("end withContext")
}
22 withContext
111 withContext
1 withContext
2 withContext
end withContext