协程一 : Kotlin 协程(一)
fun main() = runBlocking {
val job = launch {
// repeat 函数是一个内联函数,repeat(500) 表示重复执行500次
repeat(500) { i ->
println("Hello $i")
delay(500)
}
}
delay(1800)
println("World")
// 取消协程该次操作
job.cancel()
// 可以在一个作业中等待另一个作业结束后再进行其他操作
job.join() // 等待作业执行结束
println("Main函数退出了...")
}
Hello 0
Hello 1
Hello 2
Hello 3
World
Main函数退出了...
fun main() = runBlocking {
val job = launch {
// repeat 函数是一个内联函数,repeat(500) 表示重复执行500次
repeat(500) { i ->
println("Hello $i")
delay(500)
}
}
delay(1800)
println("World")
// 取消当前作业,并等待作业执行结束
job.cancelAndJoin()
println("Main函数退出了...")
}
Hello 0
Hello 1
Hello 2
Hello 3
World
Main函数退出了...
fun main() = runBlocking {
// 开始时间
val startTime = System.currentTimeMillis()
val job = launch(Dispatchers.Default) {
// 下一次打印时间
var nextPrintTime = startTime
var i = 0
while (i < 10) { // 循环计算
if (System.currentTimeMillis() >= nextPrintTime) {
println("job sleeping ${i++} ")
nextPrintTime += 500
}
}
}
delay(1800)
println("Hello World")
job.cancelAndJoin()
println("Main函数退出了...")
}
job sleeping 0
job sleeping 1
job sleeping 2
job sleeping 3
Hello World
job sleeping 4
job sleeping 5
job sleeping 6
job sleeping 7
job sleeping 8
job sleeping 9
Main函数退出了...
fun main() = runBlocking {
// 开始时间
val startTime = System.currentTimeMillis()
val job = launch(Dispatchers.Default) {
// 下一次打印时间
var nextPrintTime = startTime
var i = 0
while (isActive) { // 可以被取消的计算循环
if (System.currentTimeMillis() >= nextPrintTime) {
println("job sleeping ${i++} ")
nextPrintTime += 500
}
}
}
delay(1800)
println("Hello World")
job.cancelAndJoin()
println("Main函数退出了...")
}
job sleeping 0
job sleeping 1
job sleeping 2
job sleeping 3
Hello World
Main函数退出了...
fun main() = runBlocking {
val job = launch {
// repeat 函数是一个内联函数,repeat(500) 表示重复执行500次
try {
repeat(500) { i ->
println("Hello $i")
delay(500)
}
} finally {
println("执行了finally块...")
}
}
delay(1800)
println("World")
// 取消当前作业,并等待作业执行结束
job.cancelAndJoin()
println("Main函数退出了...")
}
示例(5)执行结果:
Hello 0
Hello 1
Hello 2
Hello 3
World
执行了finally块...
Main函数退出了...
fun main() = runBlocking {
val job = launch {
// repeat 函数是一个内联函数,repeat(500) 表示重复执行500次
try {
repeat(500) { i ->
println("Hello $i")
delay(500)
}
} finally {
println("执行了finally块...")
delay(500)
println("在finally 中执行delay之后...")
}
}
delay(1800)
println("World")
// 取消当前作业,并等待作业执行结束
job.cancelAndJoin()
println("Main函数退出了...")
}
Hello 0
Hello 1
Hello 2
Hello 3
World
执行了finally块...
Main函数退出了...
fun main() = runBlocking {
val job = launch {
// repeat 函数是一个内联函数,repeat(500) 表示重复执行500次
try {
repeat(500) { i ->
println("Hello $i")
delay(500)
}
} finally {
withContext(NonCancellable){
println("执行了finally块...")
delay(500)
println("在finally 中执行delay之后...")
}
}
}
delay(1800)
println("World")
// 取消当前作业,并等待作业执行结束
job.cancelAndJoin()
println("Main函数退出了...")
}
Hello 0
Hello 1
Hello 2
Hello 3
World
执行了finally块...
在finally 中执行delay之后...
Main函数退出了...
fun main() = runBlocking {
withTimeout(1800){
repeat(1000) {
i ->
println("Hello $i")
delay(400)
}
}
}
hello 0
hello 1
hello 2
hello 3
hello 4
Exception in thread "main" kotlinx.coroutines.TimeoutCancellationException: Timed out waiting for 1900 ms
at kotlinx.coroutines.TimeoutKt.TimeoutCancellationException(Timeout.kt:116)
at kotlinx.coroutines.TimeoutCoroutine.run(Timeout.kt:86)
at kotlinx.coroutines.EventLoopImplBase$DelayedRunnableTask.run(EventLoop.common.kt:492)
at kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoop.common.kt:271)
at kotlinx.coroutines.DefaultExecutor.run(DefaultExecutor.kt:68)
at java.lang.Thread.run(Thread.java:748)
fun main() = runBlocking {
val result = withTimeoutOrNull(1800){
repeat(1000) {
i ->
println("Hello $i")
delay(300)
}
"Hello World"
}
println("Result is $result")
}
Hello 0
Hello 1
Hello 2
Hello 3
Hello 4
Hello 5
Result is null