@Testfun`test cancel cpu task by isActive`()= runBlocking<Unit>{val startTime = System.currentTimeMillis()val job =launch(Dispatchers.Default){var nextPrintTime = startTime
var i =0while(i <5&& isActive){//isActive 判断cancel是否被调用,没有被调用为trueif(System.currentTimeMillis()>= nextPrintTime){println("job: I'm sleeping")
nextPrintTime +=500}}}delay(1300)println("main: I'm tired of waiting")
job.cancelAndJoin()println("main: Now I can quit")}@Testfun`test cancel cpu task by ensureActive`()= runBlocking<Unit>{val startTime = System.currentTimeMillis()val job =launch(Dispatchers.Default){var nextPrintTime = startTime
var i =0while(i <5){ensureActive()//退出子协程会抛出异常,异常被静默处理,可以手动捕获if(System.currentTimeMillis()>= nextPrintTime){println("job: I'm sleeping")
nextPrintTime +=500}}}delay(1300)println("main: I'm tired of waiting")
job.cancelAndJoin()println("main: Now I can quit")}@Testfun`test cancel cpu task by yield`()= runBlocking<Unit>{val startTime = System.currentTimeMillis()val job =launch(Dispatchers.Default){var nextPrintTime = startTime
var i =0while(i <5){yield()//退出子协程会抛出异常,异常被静默处理,可以手动捕获if(System.currentTimeMillis()>= nextPrintTime){println("job: I'm sleeping")
nextPrintTime +=500}}}delay(1300)println("main: I'm tired of waiting")
job.cancelAndJoin()println("main: Now I can quit")}
@Testfun`test crelease resources`()= runBlocking<Unit>{var job = launch {try{repeat(1000){ i ->println("job: I'm sleeping $i")delay(500L)}}finally{//释放资源println("job: I'm running finally")}}delay(1300)println("main: I'm tired of waiting")
job.cancelAndJoin()println("main: Now I can quit")}@Testfun`test use function`()= runBlocking<Unit>{var br =BufferedReader(FileReader("D:\\a.txt"))with(br){var line: String?try{while(true){
line =readLine()?:break;println(line)}}finally{close()}}//use函数自动调用close方法 关闭释放资源BufferedReader(FileReader("D:\\a.txt")).use{var line: String?while(true){
line = it.readLine()?:break;println(line)}}}
@Testfun`test cancel with NonCancellable`()= runBlocking<Unit>{var job = launch {try{repeat(1000){ i ->println("job: I'm sleeping $i")delay(500L)}}finally{//释放资源//协程取消时使用withContext来不影响finally中的执行内容withContext(NonCancellable){println("job: I'm running finally")delay(1000L)println("job: And I've just delayed for 1 sec because I'm non-cancellable")}}}delay(1300)println("main: I'm tired of waiting")
job.cancelAndJoin()println("main: Now I can quit")}
超时任务
1.很多情况下取消一个协程的理由是它有可能超时。
2.withTimeoutOrNull通过返回null来进行超时操作,从而代替抛出一个异常。
@Testfun`test deal with timeout`()= runBlocking<Unit>{withTimeout(1300){repeat(1000){ i->println("job: I'm sleeping $i")delay(500L)}}}@Testfun`test deal with timeout return null`()= runBlocking<Unit>{val result =withTimeoutOrNull(1300){repeat(1000){ i->println("job: I'm sleeping $i")delay(500L)}"Done"}?:"yuknight"println("Result is $result")}