Coroutine yapısı, ne işe yarar, nedir, neden kullanılır ve temel kullanım örnekleri nelerdir
🔮 Ne İşe Yarar
🕊️ Thread işlemlerini kolaylaştıran bir hafif yapıdır
👷♂️ Coroutine ile inline thread kullanabilirsin
✨ Otomatik olarak optimize edilirler
📢 Kullanabilmek için Kotlin Coroutine desteğini buradan projene eklemen lazım
🧱 Temel Kullanım
🧐 GlobalScope bağımsız olarak çalışır
🙄 İçinde bulunduğu thread bitse bile devam eder
🌇 GlobalScope.launch {} coroutine'i işi bitince sonlanır (daemon)
👪 repeat ile birden fazla tekrarlanabilir
import kotlinx.coroutines.*funmain() { GlobalScope.launch { // Arka planda yeni bir işlem (coroutine) başlatırdelay(1000L)println("World!") }println("Hello,") // Ana thread üzerinde çalışırrunBlocking { // Bu alandaki işlemler de ana thread'i engellerdelay(2000L) // ... 2s gecikmeden sonra JVM çalışmaya devam eder } }// Unit döndüren bir coroutine tanımlama (yukarıdaki ile aynıdır)funmain() =runBlocking<Unit> { GlobalScope.launch { delay(1000L)println("World!") }println("Hello,")delay(2000L)}// Tekrarlı kullanım ypaısıfunmain() =runBlocking<Unit> { GlobalScope.launch { delay(1000L)println("World!") }repead(3) {println("Hello,")delay(2000L) }}
🏗️ İş Oluşturma
🏃♂️ Thread nesnelerinden farklı olarak Job hemen başlatılır
✋ Durdurmak için cancel metodu kullanılır
val job = GlobalScope.launch { // Coroutine oluşturma (thread oluşturma gibi)delay(1000L)println("World!")}println("Hello,")job.join() // Coroutine bitene kadar bekleme (thread.join() gibi)
val startTime = System.currentTimeMillis()val job =launch(Dispatchers.Default) {var nextPrintTime = startTimevar i =0while (isActive) { // cancellable computation loop// print a message twice a secondif (System.currentTimeMillis() >= nextPrintTime) {println("job: I'm sleeping ${i++} ...") nextPrintTime +=500L } }}delay(1300L) // delay a bitprintln("main: I'm tired of waiting!")job.cancelAndJoin() // cancels the job and waits for its completionprintln("main: Now I can quit.")
💠 Suspend Metotlar
🚫 Coroutine içeren metotlar suspent anahtarı ile belirtilir
💫 async içerisinde kullanılarak asenkron çalışabilirler
🛑 await metodu ile çalışmasını tamamlaması beklenebilir
🙄 GlobalScope.async {} yapısı ile diğer diller gibi çalışabilir ama tavsiye edilmez
funmain() =runBlocking<Unit> {val time1 =measureTimeMillis { // 2017msval one1 =doSomethingUsefulOne()val two1 =doSomethingUsefulTwo()println("The answer is ${one + two}") }println("Completed in $time ms")val time2 =measureTimeMillis { // 1017ms <- Async çalıştığı için daha hızlıval one2 =async { doSomethingUsefulOne() }val two2 =async { doSomethingUsefulTwo() }println("The answer is ${one.await() + two.await()}") }println("Completed in $time ms")val time3 =measureTimeMillis{ // 1017ms <- Async çalışır one2.await() + two2.await() }}suspendfunconcurrentSum(): Int=coroutineScope {val one =async { doSomethingUsefulOne() }val two =async { doSomethingUsefulTwo() } one.await() + two.await()}suspendfundoSomethingUsefulOne(): Int {delay(1000L) // pretend we are doing something useful herereturn13}suspendfundoSomethingUsefulTwo(): Int {delay(1000L) // pretend we are doing something useful here, tooreturn29}