more coroutines demos
This commit is contained in:
parent
473cef530e
commit
cbfecbb8ad
33
src/main/kotlin/demos/channel.kt
Normal file
33
src/main/kotlin/demos/channel.kt
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
package demos
|
||||||
|
|
||||||
|
import kotlinx.coroutines.CoroutineScope
|
||||||
|
import kotlinx.coroutines.channels.Channel
|
||||||
|
import kotlinx.coroutines.isActive
|
||||||
|
import kotlin.coroutines.CoroutineContext
|
||||||
|
import kotlin.random.Random
|
||||||
|
|
||||||
|
class ChannelDemo: CoroutineScope{
|
||||||
|
override val coroutineContext: CoroutineContext
|
||||||
|
get() = TODO("Not yet implemented")
|
||||||
|
|
||||||
|
val channel = Channel<Double>()
|
||||||
|
val channel2 = Channel<Double>()
|
||||||
|
|
||||||
|
suspend fun produce(){
|
||||||
|
while (isActive){
|
||||||
|
channel.send(Random.nextDouble())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun consume(){
|
||||||
|
// while (isActive){
|
||||||
|
// val res = channel.receive()
|
||||||
|
// println(res)
|
||||||
|
// }
|
||||||
|
for(res in channel){
|
||||||
|
println(res)
|
||||||
|
channel2.send(res)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
52
src/main/kotlin/demos/coroutineContext.kt
Normal file
52
src/main/kotlin/demos/coroutineContext.kt
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
package demos
|
||||||
|
|
||||||
|
import kotlinx.coroutines.*
|
||||||
|
import kotlin.coroutines.CoroutineContext
|
||||||
|
import kotlin.coroutines.coroutineContext
|
||||||
|
|
||||||
|
//fun doSomething(){
|
||||||
|
// coroutineContext
|
||||||
|
//}
|
||||||
|
|
||||||
|
suspend fun doSomethingSuspended(name: String) {
|
||||||
|
println("$name : ")
|
||||||
|
println(coroutineContext)
|
||||||
|
println(coroutineContext[Job])
|
||||||
|
}
|
||||||
|
|
||||||
|
class MyApplication(parentContext: CoroutineContext) : CoroutineScope {
|
||||||
|
override val coroutineContext: CoroutineContext =
|
||||||
|
parentContext + SupervisorJob(parentContext[Job]) + CoroutineName("MyApplication")
|
||||||
|
}
|
||||||
|
|
||||||
|
fun main(): Unit {
|
||||||
|
runBlocking {
|
||||||
|
val myApplication = MyApplication(coroutineContext)
|
||||||
|
|
||||||
|
myApplication.launch(Dispatchers.IO + CoroutineName("A")) {
|
||||||
|
delay(20)
|
||||||
|
doSomethingSuspended("A")
|
||||||
|
}
|
||||||
|
|
||||||
|
// val job = myApplication.launch(CoroutineName("B")) {
|
||||||
|
// doSomethingSuspended("B")
|
||||||
|
// error("F")
|
||||||
|
// }
|
||||||
|
|
||||||
|
val result = async {
|
||||||
|
delay(20)
|
||||||
|
22
|
||||||
|
}
|
||||||
|
|
||||||
|
println(result.await())
|
||||||
|
// supervisorScope {
|
||||||
|
// launch(CoroutineExceptionHandler { coroutineContext, throwable ->
|
||||||
|
// println("Fail")
|
||||||
|
// }) {
|
||||||
|
// error("ddd")
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
50
src/main/kotlin/demos/flow.kt
Normal file
50
src/main/kotlin/demos/flow.kt
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
package demos
|
||||||
|
|
||||||
|
import kotlinx.coroutines.channels.Channel
|
||||||
|
import kotlinx.coroutines.coroutineScope
|
||||||
|
import kotlinx.coroutines.delay
|
||||||
|
import kotlinx.coroutines.flow.*
|
||||||
|
import kotlin.random.Random
|
||||||
|
|
||||||
|
suspend fun main() {
|
||||||
|
coroutineScope {
|
||||||
|
val f = flow {
|
||||||
|
while (true) {
|
||||||
|
val value = Random.nextDouble()
|
||||||
|
delay(10)
|
||||||
|
println("Emitted $value!")
|
||||||
|
emit(value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val res = f
|
||||||
|
.map { it + 1 }
|
||||||
|
.flatMapConcat {
|
||||||
|
flow {
|
||||||
|
emit(it)
|
||||||
|
emit(it+1)
|
||||||
|
}
|
||||||
|
}.onEach {
|
||||||
|
delay(20)
|
||||||
|
println("Collected $it!")
|
||||||
|
}.launchIn(this)
|
||||||
|
|
||||||
|
delay(500)
|
||||||
|
res.cancel()
|
||||||
|
|
||||||
|
val f2 = channelFlow<Int> {
|
||||||
|
repeat(10){
|
||||||
|
val value = Random.nextInt()
|
||||||
|
println("Hot int: $value")
|
||||||
|
send(value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
f2.take(1).collect {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
val sharedFlow = MutableSharedFlow<Double>()
|
||||||
|
sharedFlow.emit(2.0)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user