Coroutine Builder: nedir, coroutine oluşturucu türleri ve nasıl çalışırlar

Yazar: IT Sectr Yayınlanma: 2026-06-21 Okuma süresi: 8 dk

Coroutine Builder — coroutine'leri oluşturan ve başlatan, yürütme şekillerini tanımlayan Kotlin Coroutines işlevleridir. launch, async, runBlocking ve produce oluşturucuları, arka plan görevlerinden sonuç döndüren paralel hesaplamalara kadar farklı senaryoları kapsar. JetBrains, 2024'e göre Coroutine Builder, yapılandırılmış eşzamanlılık ve yaşam döngüsü yönetimi sağlayarak coroutine modelinin temelidir.

Önemli Noktalar

  • Coroutine Builder — belirli bir CoroutineScope içinde coroutine oluşturan işlev
  • launch — sonuç döndürmeden coroutine başlatır, bir Job nesnesi döndürür
  • async — Deferred döndürerek coroutine başlatır, await() ile sonuç almayı sağlar
  • runBlocking — geçerli iş parçacığını bloklar, bloklayan ve askıya alan kod arasında köprü görevi görür
  • produce — veri akışı için kanallı coroutine oluşturur (Flow lehine kullanımdan kaldırıldı)

Coroutine Builder nedir?

Coroutine Builder, bir CoroutineScope ve bir suspend bloğu alarak yeni bir coroutine oluşturan ve başlatan bir Kotlin uzantı işlevidir. Her oluşturucu, coroutine'in nasıl yürütüleceğini tanımlar: sonuç döndürmeli veya döndürmesiz, iş parçacığı bloklamalı veya eşzamansız olarak. Oluşturucular, dilin coroutine modeline giriş noktalarıdır.

Tüm oluşturucular, alt coroutine'lerin yaşam döngüsünü yöneten CoroutineScope aracılığıyla çalışır. Bir kapsam iptal edildiğinde, bu kapsam üzerinden başlatılan tüm coroutine'ler otomatik olarak iptal edilir — bu yapılandırılmış eşzamanlılık ilkesidir. Bu yaklaşım, coroutine sızıntılarını önler ve öngörülebilir sonlandırma sağlar.

kotlin
import kotlinx.coroutines.*

fun main() = runBlocking {
    // Oluşturucular CoroutineScope içinde çalışır
    val job = launch {
        delay(1000L)
        println("Dünya!")
    }
    println("Merhaba,")
    job.join()
}

Coroutine oluşturucu türleri

Kotlin dört yerleşik coroutine oluşturucu sağlar: launch, async, runBlocking ve produce. Her birinin kendi dönüş türü ve uygulama alanı vardır. Android mobil geliştirme için ana oluşturucular launch ve async'dir — bloklamayan şekilde çalışır ve mimari bileşenlerle entegre olur.

OluşturucuDönüş türüİş parçacığı bloklamaSenaryo
launchJobHayırFire-and-forget görevler
asyncDeferred<T>HayırParalel hesaplamalar
runBlockingTEvetTestler, main işlevi
produceReceiveChannel<E>HayırAkış (kullanımdan kaldırıldı)

Her oluşturucu ek parametreler kabul eder: CoroutineStart (başlatma stratejisi), CoroutineContext (dağıtıcı, istisnalar) ve adlandırılmış bir kod bloğu. Varsayılan olarak, coroutine hemen başlar (CoroutineStart.DEFAULT).

launch: fire-and-forget yürütme

launch, Android geliştirmede en çok kullanılan oluşturucudur. Sonuç döndürmeyen bir coroutine başlatır ve yaşam döngüsünü yönetmek için bir Job nesnesi döndürür. Bu, yalnızca yan etki gerektiren işlemler için ideal seçimdir: veritabanına kaydetme, analitik gönderme, arayüz güncelleme.

launch sözdizimi ve kullanımı

launch oluşturucusu CoroutineScope, isteğe bağlı bir CoroutineContext ve bir suspend bloğu kabul eder. Döndürülen Job, coroutine'i iptal etmeye, tamamlanmasını beklemeye veya durumunu kontrol etmeye olanak tanır.

kotlin
val scope = CoroutineScope(Dispatchers.IO + SupervisorJob())
val job: Job = scope.launch(CoroutineStart.LAZY) {
    val data = fetchFromNetwork()
    saveToDatabase(data)
}
job.start()
job.join()

CoroutineStart.LAZY parametresi, start() veya join() açıkça çağrılana kadar yürütmeyi erteler. Bu, gecikmeli başlatma ve koşullu yürütme için kullanışlıdır. Standart anında yürütme için CoroutineStart.DEFAULT kullanılır veya parametre atlanır.

async: sonuçlu paralel hesaplamalar

async, Deferred<T> — bir sonucun eşzamansız vaadi döndüren oluşturucudur. await() çağrısı, iş parçacığını bloklamadan sonuç elde edilene kadar coroutine'i askıya alır. Bu, Kotlin coroutine'lerinde paralel görevler için birincil mekanizmadır.

İki isteği paralel olarak başlatma

async, birden çok bağımsız işlemi aynı anda yürütmeniz gerektiğinde özellikle etkilidir. Suspend işlevlerinin sıralı çağrılarının aksine, async coroutine'leri paralel olarak başlatarak toplam yürütme süresini azaltır.

kotlin
suspend fun fetchUserData(): UserData {
    val deferred1 = CoroutineScope(Dispatchers.IO).async { api.getProfile() }
    val deferred2 = CoroutineScope(Dispatchers.IO).async { api.getSettings() }
    val deferred3 = CoroutineScope(Dispatchers.IO).async { api.getNotifications() }
    return UserData(
        profile = deferred1.await(),
        settings = deferred2.await(),
        notifications = deferred3.await()
    )
}

Deferred, Job'dan devralır, bu nedenle async tüm yaşam döngüsü işlemlerini destekler: iptal, tamamlanma bekleme, istisna işleme. Bir kapsam iptal edildiğinde, alt Deferred coroutine'leri otomatik olarak iptal edilir.

runBlocking: bloklayan dünyaya köprü

runBlocking, coroutine tamamlanana kadar geçerli iş parçacığını bloklayan tek oluşturucudur. Yeni bir CoroutineScope oluşturur ve iletilen coroutine'i başlatarak çağıran iş parçacığını bloklar. main() giriş noktalarında, testlerde ve bloklayan kodla entegrasyonda kullanılır.

runBlocking ne zaman gereklidir

runBlocking üç senaryoda haklıdır: uygulama giriş noktası (main), suspend işlevlerinin birim testleri ve suspend kullanılamayan geri arama tabanlı kütüphanelerle entegrasyon. Üretim Android kodunda, ana iş parçacığında runBlocking kullanımı kesinlikle önerilmez.

kotlin
class CoroutineTest {
    @Test
    fun `test suspend function`() = runBlocking {
        val result = mySuspendFunction()
        assertEquals("expected", result)
    }
}

Testler için runBlocking yerine TestCoroutineDispatcher ile kotlinx-coroutines-test kullanılması önerilir — bu, zaman kontrolü sağlar ve test ortamında bloklamayı önler.

Doğru oluşturucu nasıl seçilir

Coroutine Builder seçimi, döndürülen sonuca ve yürütme senaryosuna bağlıdır. İşlem veri döndürmeyi gerektirmiyorsa — launch kullanın. Eşzamansız bir işlemin sonucuna ihtiyacınız varsa — async kullanın. runBlocking yalnızca köprüleme için kullanılmalı ve reaktif akışlar için produce'u Flow ile değiştirin.

Android için pratik öneriler

Kotlin Coroutines kullanan Android projelerinde ana oluşturucu çifti launch ve async'dir. launch, ViewModel ve UseCases'te coroutine başlatmak için kullanılırken, async ağ veya veritabanına paralel istekler için kullanılır. Modern kütüphaneler (Ktor, Room) zaten suspend işlevlerini destekler, bu da async'in doğrudan kullanım ihtiyacını en aza indirir.

  • launch — fire-and-forget için (günlük kaydı, analitik, önbellekleme)
  • async — sonuçları birleştiren paralel istekler için
  • runBlocking — yalnızca main() ve testlerde (üretimde Main iş parçacığında değil)
  • produce — Flow / SharedFlow / StateFlow ile değiştirin

Sıkça Sorulan Sorular

Kotlin'de launch ve async arasındaki fark nedir?

launch Job döndürür ve yürütme sonucu döndürmezken, async Deferred<T> döndürür — await() ile sonucun alınabileceği bir nesne. launch fire-and-forget işlemleri için, async veri döndüren görevler için kullanılır.

Android Activity'de runBlocking kullanılabilir mi?

Önerilmez. Ana iş parçacığında runBlocking ANR'ye neden olur ve arayüzü bloklar. Activity ve Fragment içinde lifecycleScope.launch kullanın — bu, bloklama olmadan yerleşik bir çözümdür.

launch oluşturucusu ne döndürür?

launch oluşturucusu, coroutine yaşam döngüsünü kontrol etmeye olanak tanıyan bir Job nesnesi döndürür: iptal (cancel), tamamlanma bekleme (join), durum kontrolü (isActive, isCompleted, isCancelled).

Kotlin Coroutines'te Deferred nedir?

Deferred<T>, async oluşturucusu tarafından döndürülen bir sonucun eşzamansız vaadidir. Job'dan devralır ve şu yöntemleri ekler: sonuç almak için await(), bloklamayan erişim için getCompleted() ve istisna kontrolü için getCompletionExceptionOrNull().

Gecikmeli launch nasıl başlatılır?

CoroutineStart.LAZY parametresini kullanın: scope.launch(start = CoroutineStart.LAZY) { ... }. Ardından gerçek yürütme için job.start() veya job.join() çağrısı yapın. Bu, gecikmeli başlatma ve koşullu coroutine yürütme için kullanışlıdır.

Özet

  • Coroutine Builder — yürütme şeklini ve dönüş türünü tanımlayan coroutine oluşturma işlevi
  • launch — sonuçsuz görevler için ana oluşturucu, coroutine yönetimi için Job döndürür
  • async — paralel hesaplamalar için oluşturucu, sonucun await() olanağıyla Deferred döndürür
  • runBlocking — main() ve testler için bloklayan oluşturucu, Android ana iş parçacığında önerilmez
  • Yapılandırılmış eşzamanlılık, kapsam iptalinde alt coroutine'lerin otomatik iptalini garanti eder
  • produce kullanımdan kaldırıldı — reaktif veri akışları için Flow, SharedFlow veya StateFlow kullanın
  • Oluşturucu seçimi senaryoya bağlıdır: fire-and-forget → launch, paralel veri → async, köprüleme → runBlocking

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun