//1.调度器 协程构造器(协程调度器) 将协程分派到线程中运行
fun mainDispatcher()= runBlocking {
launch {
println("launch ${Thread.currentThread().name} ..")//主线程
}
launch(Dispatchers.Unconfined) {
println("Unconfined ${Thread.currentThread().name} ..")//主线程 它是一种不同的机制
}
launch(Dispatchers.Default) {
println("Default ${Thread.currentThread().name} ..")//后台线程池
}
launch(newSingleThreadContext("newSingleThreadContext")) {
println("thread ${Thread.currentThread().name} ..")//创建新线程
}
}
//2.调度器在调用者线程中启动一个协程,但它仅仅只是运行到第一个挂起点。
// 在挂起之后,它将恢复线程中的协程,该协程完全由调用的挂起函数决定
//调度器是默认继承于外部的协程作用域的
fun mainUnconfined()= runBlocking {
launch(Dispatchers.Unconfined) {
println("Unconfined ${Thread.currentThread().name} ..")//主线程
delay(1000)
println("Unconfined ${Thread.currentThread().name} ..end")//线程池
}
launch {
println("launch ${Thread.currentThread().name} ..")//主线程
delay(1000)
println("launch ${Thread.currentThread().name} ..end")//主线程
}
}
//3.调试
fun log(msg: String) = println("[${Thread.currentThread().name}] $msg")//打印线程名
fun mainLog()= runBlocking {
var a=async {
delay(1000)
log("a协程")
1
}
var b=async {
delay(2000)
log("b协程")
2
}
log("a+b=${a.await()+b.await()}")
}
//4.在线程间切换
fun mainwithContext() {
newSingleThreadContext("Ctx1").use { ctx1 ->
newSingleThreadContext("Ctx2").use { ctx2 ->
runBlocking(ctx1) {//对显示指定的上下文使用 runBlocking
log("Started in ctx1")//[Ctx1] Started in ctx1
withContext(ctx2) {//更改协程的上下文并同时仍然保持在另一个协程中
log("Working in ctx2")//[Ctx2] Working in ctx2
}
log("Back to ctx1")//[Ctx1] Back to ctx1
}
}
}//use 在不再需要时释放 newSingleThreadContext 所创建的线程
}
//5.子协程
fun mainChildren_coroutine()= runBlocking {
val facher=launch {
GlobalScope.launch {// GlobalScope 启动协程 协程的 Job 没有父级,所以不受其启动的作用域和独立运作范围的限制
println("GlobalScope ..")
delay(1000)
println("GlobalScope ..end")
}
launch {
delay(100)
println("launch ..")
delay(1000)
println("launch ..end")
}
}
delay(500)
facher.cancel()//当父协程取消 子协程也被取消 launch的协程没有运行完
delay(1000)
println("facher ..end")
}
//6.父协程
fun mainfacher_coroutine()= runBlocking {
val facher=launch {
GlobalScope.launch {// GlobalScope 启动协程 协程的 Job 没有父级,所以不受其启动的作用域和独立运作范围的限制
println("GlobalScope ..")
delay(1000)
println("GlobalScope ..end")
}
launch {
delay(100)
println("launch ..")
delay(1000)
println("launch ..end")
}
}
delay(500)
// facher.join()//当父协程会等待子协程完才结束 launch的协程运行完
delay(1000)
println("facher ..end")
}
//7.协程命名以便调试
fun maincoroutine_name()= runBlocking(CoroutineName("main")) {
log("Started")
val a=launch(CoroutineName("a")) {
delay(1000)
log(" a..")
}
val b= launch(CoroutineName("b")) {
delay(1000)
log(" ..b")
}
println(" ..end")
}
//8.协程命名以便调试
fun mainCoroutineName()= runBlocking() {
launch(Dispatchers.Default+ CoroutineName("test")) {
println("thread is ${Thread.currentThread().name}")
}
println(" ..end")
}
//9.线程局部数据 ThreadLocal
fun mainThreadLocal()= runBlocking() {
val threadLocal=ThreadLocal<String>()
threadLocal.set("main")
println("当前线程: ${Thread.currentThread()},threadLocal的值: '${threadLocal.get()}'")
val job = launch(Dispatchers.Default+ threadLocal.asContextElement(value = "launch")) {
println("Launch 当前线程: ${Thread.currentThread()}, threadLocal的值: '${threadLocal.get()}'")// DefaultDispatcher-worker-1,5,main launch
yield()
println("yield, 当前线程: ${Thread.currentThread()}, threadLocal的值: '${threadLocal.get()}'")// DefaultDispatcher-worker-1,5,main launch
}
job.join()
println("end .. current thread: ${Thread.currentThread()}, threadLocal的值: '${threadLocal.get()}'") //Thread[main,5,main] 'main'
job.cancel()
}
//10 协程作用域
fun mainCoroutinescope() = runBlocking<Unit> {
val activity = ActivityTest()
activity.doSomething() //运行
println("销毁...")
activity.destroy()
delay(1000) //销毁后,不再打印
}
ActivityTest类
//用于 10 协程作用域的
class ActivityTest : CoroutineScope by CoroutineScope(Dispatchers.Default) {//实现 CoroutineScope接口 默认工厂函数使用委托
fun destroy() {
cancel() // 扩展于CoroutineScope
}
fun doSomething() {
// repeat来自CoroutineScope的
repeat(10) { i ->
launch {
delay((i + 1) * 200L) // variable delay 200ms, 400ms, ... etc
println("Coroutine $i is done")
}
}
}
}