Kotlin Coroutine'ler: Thread vs Async Seçimi Rehberi
Kotlin'de eşzamanlı işlemler yaparken sık sık kafanız karışır: thread açmalı mı, launch mı, async mı kullanmalı? Doğru seçim performansı ve kodun okunabilirliğini doğrudan etkiler.
Geleneksel Java thread'leri sistem kaynağı açısından ağırdır. Her thread bellek ayırır, bağlam değiştirme maliyeti yüksektir. Coroutine'ler bunun tersine hafif ve binlercesini aynı anda çalıştırabilirsiniz.
Thread kullanın: Sistem seviyesi işlemler, native kod çağrıları veya thread-local storage gerektiğinde.
launch kullanın: Sonucu umursamadığınız arka plan işleri için (loglama, analytics).
async kullanın: Sonucu beklemek istediğiniz, birden fazla eşzamanlı işi koordine etmek gerektiğinde.
İki API'den paralel veri çekip birleştirme senaryosu:
1import kotlinx.coroutines.*23suspend fun fetchUser(id: Int): String {4delay(1000) // API çağrısını simüle et5return "User $id"6}78suspend fun fetchPosts(userId: Int): String {9delay(800) // API çağrısını simüle et10return "Posts for User $userId"11}1213suspend fun main() {14val startTime = System.currentTimeMillis()1516// async ile paralel çalıştır17val userDeferred = async { fetchUser(1) }18val postsDeferred = async { fetchPosts(1) }1920// Her ikisinin sonucunu bekle21val user = userDeferred.await()22val posts = postsDeferred.await()2324println("$user")25println("$posts")26println("Toplam süre: ${System.currentTimeMillis() - startTime}ms")27}Beklenen çıktı:
1User 12Posts for User 13Toplam süre: 1000ms (1800ms değil!)Async sayesinde iki işlem paralel çalışır, toplam süre en uzun işin süresidir.
1scope.launch {2// Ateş ve unut - sonuç almıyoruz3delay(1000)4println("Arkaplanda tamamlandı")5}67val deferred = scope.async {8// Sonuç döndür9delay(1000)10return@async "Veri hazır"11}12val result = deferred.await() // Sonucu alLaunch bir Job döndürür, async bir Deferred döndürür. Deferred'den await() ile sonuç alırsınız.
Coroutine'ler thread'lerin yerini almaz, onları daha verimli hale getirir. Basit arka plan işler için launch, sonuç beklemeniz gerekiyorsa async seçin. Thread'leri yalnızca sistem seviyesi ihtiyaçlar için tutun.
0 yorum