/**
* 密集型的任务取消
*/
@Test
fun `test cancel cpu task by isActive`() = runBlocking<Unit> {
val startTime = System.currentTimeMillis()
val job = launch(Dispatchers.Default) {
var nexPrintTime = startTime
var i = 0
while (i < 5 && isActive) {
if (System.currentTimeMillis() >= nexPrintTime) {
println("job:I'm sleeping ${i++}...")
nexPrintTime += 500
}
}
}
delay(1300)
println("main:I'm tired of waiting")
job.cancelAndJoin()
println("main:Now i can quit.")
}
如果不加 && isActive
会无法取消掉 把四次结果都打印出来。。
也可以是使用这个方法
/**
* 密集型的任务取消
*/
@Test
fun `test cancel cpu task by enSureActive`() = runBlocking<Unit> {
val startTime = System.currentTimeMillis()
val job = launch(Dispatchers.Default) {
var nexPrintTime = startTime
var i = 0
while (i < 5) {
ensureActive()
if (System.currentTimeMillis() >= nexPrintTime) {
println("job:I'm sleeping ${i++}...")
nexPrintTime += 500
}
}
}
delay(1300)
println("main:I'm tired of waiting")
job.cancelAndJoin()
println("main:Now i can quit.")
}
ensureActive() 抛出Cancel的那个异常来退出循环
还有一种方式通过yield
/**
* 密集型的任务取消
*/
@Test
fun `test cancel cpu task by yield`() = runBlocking<Unit> {
val startTime = System.currentTimeMillis()
val job = launch(Dispatchers.Default) {
var nexPrintTime = startTime
var i = 0
while (i < 5) {
yield()
if (System.currentTimeMillis() >= nexPrintTime) {
println("job:I'm sleeping ${i++}...")
nexPrintTime += 500
}
}
}
delay(1300)
println("main:I'm tired of waiting")
job.cancelAndJoin()
println("main:Now i can quit.")
}
yield()也是抛出异常退出
会出让线程的执行权
如果想退出的时候抛出来异常可以使用finally
/**
* 协程取消的副作用
*/
@Test
fun `test release resources`() = runBlocking<Unit> {
val 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.")
}
}
try finlly 虽然时尚。但是kotlin有更好的标准函数 use
可以用来处理被实现了Closeable的对象
程序结束会自动调用close方法。适合文件对象。
@Test
fun `test use function`() = runBlocking<Unit> {
val filePatg =
"H:\\develop\\project\\android\\learn\\coroutine\\app\\src\\test\\java\\com\\example\\coroutine\\CoroutineTest02.kt"
println("plan1:")
val br = BufferedReader(FileReader(filePatg))
with(br) {
try {
var line: String?
while (true) {
line = readLine() ?: break
println(line)
}
} finally {
close()
}
}
//还可以使用use
println("plan2:")
val br2 = BufferedReader(FileReader(filePatg))
br2.use {
var line: String?
while (true) {
line = it.readLine() ?: break
println(line)
}
}
}