//Kotlin 协程
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.2.1"
属性:
1、runBlocking:会一直阻塞到块中的代码执行完
runBlocking {
val job = launch {
repeat(10) {//循环
delay(1000)
Log.e("zxy", "张三疯")
}
}
job.join()//等待直到子协程执行结束 主协程与后台作业的持续时间没有任何关系了
Log.e("zxy", "张老爷")
}
2、lauch:开启一个工作协程Job
3、job.cancel() // 取消一个协程
4、job.cancelAndJoin() // 取消一个协程并且等待它结束
5、Job.join://等待直到子协程执行结束,结构化的并发,无结果
6、delay:非阻塞的函数,挂起,协程进入线程池空闲线程,类似于sleep
7、repeat:协程中循环
8、async和await:协程中异步执行及等待异步结果再执行,结构化的并发,有结果
GlobalScope.launch {
val async = async {
"张三疯"
}
Log.e("zxy", async.await())//等待async执行的结果
}
9、coroutineScope :(感觉作用不大)线程作用域,不会阻塞当前线程,所有已启动子协程执行完毕之前不会结束
10、suspend:挂起函数,调用suspend方法, 异步的数据像同步一样return了
//挂起方法
suspend fun downLoad(){
Log.i("log", "World")
}
11、withContext(NonCancellable) {……},在finally
中,关闭一个文件、取消一个作业、或是关闭任何一种通信通道
12、withTimeout和withTimeoutOrNull操作超时
runBlocking {
withTimeout(1300L) {
repeat(1000) { i ->
Log.i("log","I'm sleeping $i ...")
delay(500L)
}
}
}
13、send和receive的使用
runBlocking {
val channel = Channel<Int>()//实例化通道
launch {
for (x in 1..5) channel.send(x * x)
channel.close()//此处关闭通道
}
repeat(5) {
//这里保证所有先前发送出去的元素都在通道关闭前被接收到。
Log.i("log", "${channel.receive()}")
}
}