Coroutine Builder: یہ کیا ہے، کوروٹین بلڈرز کی اقسام اور وہ کیسے کام کرتے ہیں

مصنف: IT Sectr اشاعت: 2026-06-21 مطالعے کا وقت: 8 منٹ

Coroutine Builder — Kotlin Coroutines کے فنکشنز جو کوروٹینز بناتے اور چلاتے ہیں، ان کے عملدرآمد کا طریقہ متعین کرتے ہیں۔ بلڈرز launch، async، runBlocking اور produce مختلف منظرناموں کو کور کرتے ہیں: بیک گراؤنڈ کاموں سے لے کر نتیجہ واپس کرنے والے متوازی حسابات تک۔ JetBrains, 2024 کے مطابق، Coroutine Builder کوروٹین ماڈل کی بنیاد ہے، جو ساختی ہم آہنگی اور لائف سائیکل مینجمنٹ فراہم کرتا ہے۔

اہم نکات

  • Coroutine Builder — ایک فنکشن جو مخصوص CoroutineScope کے اندر کوروٹین بناتا ہے
  • launch — نتیجہ واپس کیے بغیر کوروٹین چلاتا ہے، Job آبجیکٹ واپس کرتا ہے
  • async — Deferred واپس کرتے ہوئے کوروٹین چلاتا ہے، await() کے ذریعے نتیجہ حاصل کرنے کی اجازت دیتا ہے
  • runBlocking — موجودہ تھریڈ کو بلاک کرتا ہے، بلاک کرنے والے اور معطل کوڈ کے درمیان پل کے طور پر استعمال ہوتا ہے
  • produce — ڈیٹا سٹریمنگ کے لیے چینل کے ساتھ کوروٹین بناتا ہے (Flow کے حق میں متروک)

Coroutine Builder کیا ہے؟

Coroutine Builder ایک Kotlin ایکسٹینشن فنکشن ہے جو CoroutineScope اور ایک suspend بلاک لیتا ہے، ایک نیا کوروٹین بناتا اور چلاتا ہے۔ ہر بلڈر متعین کرتا ہے کہ کوروٹین کیسے عملدرآمد کرے گا: نتیجہ کے ساتھ یا بغیر، تھریڈ بلاکنگ کے ساتھ یا غیر متزامن طور پر۔ بلڈرز زبان کے کوروٹین ماڈل میں داخلے کے نکات ہیں۔

تمام بلڈرز CoroutineScope کے ذریعے کام کرتے ہیں، جو چائلڈ کوروٹینز کے لائف سائیکل کا انتظام کرتا ہے۔ جب کوئی دائرہ کار منسوخ ہوتا ہے، تو اس کے ذریعے چلائے جانے والے تمام کوروٹینز خود بخود منسوخ ہو جاتے ہیں — یہ ساختی ہم آہنگی کا اصول ہے۔ یہ نقطہ نظر کوروٹین لیکیج کو روکتا ہے اور پیش قیاسی خاتمے کو یقینی بناتا ہے۔

kotlin
import kotlinx.coroutines.*

fun main() = runBlocking {
    // بلڈرز CoroutineScope کے اندر چلتے ہیں
    val job = launch {
        delay(1000L)
        println("دنیا!")
    }
    println("ہیلو،")
    job.join()
}

کوروٹین بلڈرز کی اہم اقسام

Kotlin چار بلٹ ان کوروٹین بلڈرز فراہم کرتا ہے: launch، async، runBlocking اور produce۔ ہر ایک کا اپنا واپسی کی قسم اور اطلاق کا میدان ہے۔ Android موبائل ڈویلپمنٹ کے لیے، اہم بلڈرز launch اور async ہیں — یہ غیر مسدود طریقے سے کام کرتے ہیں اور آرکیٹیکچرل اجزاء کے ساتھ ضم ہوتے ہیں۔

بلڈرواپسی کی قسمتھریڈ بلاکنگمنظر نامہ
launchJobنہیںFire-and-forget کام
asyncDeferred<T>نہیںمتوازی حسابات
runBlockingTہاںٹیسٹ، main فنکشن
produceReceiveChannel<E>نہیںسٹریمنگ (متروک)

ہر بلڈر اضافی پیرامیٹرز قبول کرتا ہے: CoroutineStart (شروع کرنے کی حکمت عملی)، CoroutineContext (ڈسپیچر، استثنیات) اور ایک نامی کوڈ بلاک۔ ڈیفالٹ طور پر، کوروٹین فوری طور پر شروع ہوتا ہے (CoroutineStart.DEFAULT)۔

launch: fire-and-forget عملدرآمد

launch Android ڈویلپمنٹ میں سب سے زیادہ استعمال ہونے والا بلڈر ہے۔ یہ ایک کوروٹین شروع کرتا ہے جو نتیجہ واپس نہیں کرتا، اور اس کے لائف سائیکل کے انتظام کے لیے ایک Job آبجیکٹ واپس کرتا ہے۔ یہ ان کاموں کے لیے مثالی انتخاب ہے جن میں صرف ضمنی اثر کی ضرورت ہوتی ہے: ڈیٹا بیس میں محفوظ کرنا، تجزیات بھیجنا، انٹرفیس اپ ڈیٹ کرنا۔

launch کا نحو اور استعمال

launch بلڈر CoroutineScope، ایک اختیاری CoroutineContext اور ایک suspend بلاک قبول کرتا ہے۔ واپس کیا گیا Job کوروٹین کو منسوخ کرنے، اس کے مکمل ہونے کا انتظار کرنے یا اس کی حالت جانچنے کی اجازت دیتا ہے۔

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 پیرامیٹر start() یا join() کے واضح کال تک عملدرآمد کو مؤخر کرتا ہے۔ یہ تاخیری ابتدائیہ اور مشروط عملدرآمد کے لیے مفید ہے۔ معیاری فوری عملدرآمد کے لیے CoroutineStart.DEFAULT استعمال کیا جاتا ہے یا پیرامیٹر چھوڑ دیا جاتا ہے۔

async: نتیجہ کے ساتھ متوازی حسابات

async ایک بلڈر ہے جو Deferred<T> — نتیجہ کا ایک غیر متزامن وعدہ واپس کرتا ہے۔ await() کو کال کرنا تھریڈ کو بلاک کیے بغیر نتیجہ ملنے تک کوروٹین کو معطل کرتا ہے۔ یہ Kotlin کوروٹینز میں متوازی کاموں کے لیے بنیادی طریقہ کار ہے۔

دو درخواستوں کو متوازی چلانا

async خاص طور پر اس وقت مؤثر ہے جب آپ کو ایک ساتھ متعدد آزاد کام انجام دینے ہوں۔ suspend فنکشنز کی ترتیب وار کال کے برعکس، async کوروٹینز کو متوازی چلاتا ہے، کل عملدرآمد وقت کو کم کرتا ہے۔

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 سے وراثت پاتا ہے، لہذا async تمام لائف سائیکل کارروائیوں کو سپورٹ کرتا ہے: منسوخی، تکمیل کا انتظار، استثنیٰ ہینڈلنگ۔ جب دائرہ کار منسوخ ہوتا ہے، چائلڈ Deferred کوروٹینز خود بخود منسوخ ہو جاتے ہیں۔

runBlocking: بلاک کرنے والی دنیا کا پل

runBlocking واحد بلڈر ہے جو کوروٹین کے مکمل ہونے تک موجودہ تھریڈ کو بلاک کرتا ہے۔ یہ ایک نیا CoroutineScope بناتا ہے اور منتقل کردہ کوروٹین کو چلاتا ہے، کال کرنے والے تھریڈ کو بلاک کرتا ہے۔ یہ main() انٹری پوائنٹس، ٹیسٹوں اور بلاک کرنے والے کوڈ کے ساتھ انضمام میں استعمال ہوتا ہے۔

runBlocking کب ضروری ہے

runBlocking تین منظرناموں میں جائز ہے: ایپلیکیشن انٹری پوائنٹ (main)، suspend فنکشنز کے یونٹ ٹیسٹ اور کال بیک پر مبنی لائبریریوں کے ساتھ انضمام جہاں suspend استعمال نہیں کیا جا سکتا۔ پروڈکشن Android کوڈ میں، مرکزی تھریڈ پر runBlocking کا استعمال سختی سے تجویز نہیں کیا جاتا۔

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

ٹیسٹوں کے لیے، runBlocking کے بجائے TestCoroutineDispatcher کے ساتھ kotlinx-coroutines-test استعمال کرنے کی سفارش کی جاتی ہے — یہ وقت کا کنٹرول فراہم کرتا ہے اور ٹیسٹ ماحول میں بلاکنگ سے بچاتا ہے۔

صحیح بلڈر کا انتخاب کیسے کریں

Coroutine Builder کا انتخاب واپس کردہ نتیجہ اور عملدرآمد کے منظر نامے پر منحصر ہے۔ اگر کام کو ڈیٹا واپس کرنے کی ضرورت نہیں ہے — launch استعمال کریں۔ اگر آپ کو غیر متزامن کام کے نتیجے کی ضرورت ہے — async استعمال کریں۔ runBlocking صرف پل کے لیے استعمال کریں، اور ری ایکٹیو سٹریمز کے لیے produce کو Flow سے بدلیں۔

Android کے لیے عملی سفارشات

Kotlin Coroutines استعمال کرنے والے Android منصوبوں میں، بلڈرز کا اہم جوڑا launch اور async ہے۔ launch ViewModel اور UseCases میں کوروٹین شروع کرنے کے لیے استعمال ہوتا ہے، جبکہ async نیٹ ورک یا ڈیٹا بیس پر متوازی درخواستوں کے لیے استعمال ہوتا ہے۔ جدید لائبریریاں (Ktor, Room) پہلے ہی suspend فنکشنز کو سپورٹ کرتی ہیں، جو async کے براہ راست استعمال کی ضرورت کو کم سے کم کرتی ہیں۔

  • launch — fire-and-forget کے لیے (لاگنگ، تجزیات، کیشنگ)
  • async — نتائج کو یکجا کرنے والی متوازی درخواستوں کے لیے
  • runBlocking — صرف main() اور ٹیسٹوں میں (پروڈکشن میں Main تھریڈ پر نہیں)
  • produce — Flow / SharedFlow / StateFlow سے بدلیں

اکثر پوچھے گئے سوالات

Kotlin میں launch اور async میں کیا فرق ہے؟

launch Job واپس کرتا ہے اور عملدرآمد کا نتیجہ واپس نہیں کرتا، جبکہ async Deferred<T> واپس کرتا ہے — ایک آبجیکٹ جس سے await() کے ذریعے نتیجہ حاصل کیا جا سکتا ہے۔ launch fire-and-forget کاموں کے لیے، async ڈیٹا واپس کرنے والے کاموں کے لیے استعمال ہوتا ہے۔

کیا Android Activity میں runBlocking استعمال کیا جا سکتا ہے؟

سفارش نہیں کی جاتی۔ مرکزی تھریڈ پر runBlocking ANR کا سبب بنتا ہے اور انٹرفیس کو بلاک کرتا ہے۔ Activity اور Fragment کے اندر lifecycleScope.launch استعمال کریں — یہ بلاکنگ کے بغیر ایک بلٹ ان حل ہے۔

launch بلڈر کیا واپس کرتا ہے؟

launch بلڈر ایک Job آبجیکٹ واپس کرتا ہے، جو کوروٹین کے لائف سائیکل کو کنٹرول کرنے کی اجازت دیتا ہے: منسوخ (cancel)، تکمیل کا انتظار (join)، حالت چیک (isActive, isCompleted, isCancelled).

Kotlin Coroutines میں Deferred کیا ہے؟

Deferred<T> نتیجہ کا ایک غیر متزامن وعدہ ہے، جو async بلڈر کے ذریعے واپس کیا جاتا ہے۔ یہ Job سے وراثت پاتا ہے اور طریقے شامل کرتا ہے: نتیجہ حاصل کرنے کے لیے await()، غیر مسدود رسائی کے لیے getCompleted()، اور استثنیٰ چیک کرنے کے لیے getCompletionExceptionOrNull()۔

تاخیر کے ساتھ launch کیسے شروع کریں؟

CoroutineStart.LAZY پیرامیٹر استعمال کریں: scope.launch(start = CoroutineStart.LAZY) { ... }۔ پھر حقیقی عملدرآمد کے لیے job.start() یا job.join() کال کریں۔ یہ تاخیری ابتدائیہ اور مشروط کوروٹین عملدرآمد کے لیے مفید ہے۔

خلاصہ

  • Coroutine Builder — کوروٹین تخلیق کا فنکشن جو اس کے عملدرآمد اور واپسی کی قسم کو متعین کرتا ہے
  • launch — نتیجہ کے بغیر کاموں کے لیے اہم بلڈر، کوروٹین مینجمنٹ کے لیے Job واپس کرتا ہے
  • async — متوازی حسابات کے لیے بلڈر، نتیجہ کے await() کی صلاحیت کے ساتھ Deferred واپس کرتا ہے
  • runBlocking — main() اور ٹیسٹوں کے لیے بلاک کرنے والا بلڈر، Android مرکزی تھریڈ پر تجویز نہیں کیا جاتا
  • ساختی ہم آہنگی دائرہ کار کی منسوخی پر چائلڈ کوروٹینز کی خودکار منسوخی کو یقینی بناتی ہے
  • produce متروک ہے — ری ایکٹیو ڈیٹا سٹریمز کے لیے Flow، SharedFlow یا StateFlow استعمال کریں
  • بلڈر کا انتخاب منظر نامے پر منحصر ہے: fire-and-forget → launch، متوازی ڈیٹا → async، پل → runBlocking

ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے

IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔

پروجیکٹ پر بحث کریں

مزید پڑھیں