runBlocking — এটি কি, ব্লকিং ব্রিজ ও কিভাবে কাজ করে

লেখক: IT Sectr প্রকাশিত: 2026-06-22 পড়ার সময়: 7 মিনিট

runBlocking — Kotlin এ একটি Coroutine Builder যা পাস করা কোরুটিন শেষ হতে বর্তমান থ্রেডকে ব্লক করে। launch এবং async এর বিপরীতে, এটি একটি suspend ফাংশন নয় এবং সাধারণ (blocking) কোড থেকে ডাকা যেতে পারে। JetBrains ডকুমেন্টেশন, 2024 অনুযায়ী, runBlocking সিঙ্ক্রোনাস এবং অ্যাসিঙ্ক্রোনাস দুনিয়ার মধ্যে একটি সেতু হিসাবে কাজ করে, যা main ফাংশন এবং টেস্ট থেকে কোরুটিন শুরু করতে দেয়।

মূখ্য বিষয়াবলী

  • runBlocking — একটি ব্লকিং বিল্ডার যা CoroutineScope তৈরি করে এবং কোরুটিন শেষ হতে অপেক্ষা করে
  • থ্রেড ব্লকিং — runBlocking কোরুটিন এবং এর সকল চাইল্ড সম্পূর্ণ হতে বর্তমান থ্রেড কে আটকে রাখে
  • প্রবেশ বিন্দু — main(), JUnit টেস্ট এবং blocking এবং async কোডের মধ্যে সেতু
  • Android এর Main থ্রেডে নিষিদ্ধ — UI থ্রেডে runBlocking কল করার কারণে ANR হয়
  • বিকল্প — Android এর জন্য lifecycleScope, viewModelScope, TestCoroutineDispatcher

runBlocking কি?

runBlocking হল একটি Kotlin ফাংশন যা একটি নতুন CoroutineScope তৈরি করে এবং পাস করা কোরুটিন চালু করে, বর্তমান থ্রেডকে সম্পূর্ণ শেষ হতে ব্লক করে। অন্য সকল Coroutine Builder এর বিপরীতে, runBlocking একটি suspend ফাংশন নয় এবং সাধারণ সিঙ্ক্রোনাস কোড থেকে ডাকা যেতে পারে। runBlocking এর সিগনিচার CoroutineContext এবং একটি suspend ব্লক নেয়, T টাইপের একটি ফলাফল ফেরত দেয়।

kotlin
public fun <T> runBlocking(
    context: CoroutineContext = EmptyCoroutineContext,
    block: suspend CoroutineScope.() -> T
): T

runBlocking বর্তমান থ্রেডে একটি নতুন event-loop শুরু করে। যখন কোরুটিন একটি suspend ফাংশন (যেমন delay() বা await()) কল করে, runBlocking থ্রেডকে ব্লক করে এবং স্থগিত কোরুটিনটি পুনরায় শুরু হতে একই থ্রেডে অন্য নির্ধারিত কোরুটিন চালায়। এটি সহযোগিতামূলক ব্লকিং — থ্রেডটি নিষ্ক্রিয় থাকে না বরং অন্য কোরুটিন প্রক্রিয়া করে।

কিভাবে runBlocking কাজ করে

runBlocking এর অন্তর্গত প্রক্রিয়া event-loop এর উপর ভিত্তি করে: যখন একটি suspend ফাংশন ডাকা হয়, runBlocking বর্তমান ব্লকের মানাগুল বন্ধ করে এবং ক্য়ূ থেকে অন্য কোরুটিন চালায়। যখন suspend ফাংশন শেষ হয়, মানাগুল পুনরায় শুরু হয়। এই চক্র তবে থেকে যায় যত্না সকল কোরুটিন শেষ না হয়।

Event-loop এর অন্তর্নিহিত

runBlocking কোরুটিন চালানোর জন্য নিজস্ব একক-থ্রেড পুল ব্যবহার করে। Dispatchers.IO বা Default এর বিপরীতে, runBlocking থ্রেড পরিবর্তন করে না — এটি সকল কোরুটিন বর্তমান থ্রেডে পরিচালনা করে, তাদের এক্সিকিউশন ইন্টারলেভ করে। এটি একমাত্র বিল্ডার যা একই থ্রেডে মানাগুলের গারন্টি দেয়।

kotlin
fun main() {
    val threadName = Thread.currentThread().getName()
    println("runBlocking আগে $threadName এ")

    val result = runBlocking {
        println("runBlocking এর মধ্যে ${Thread.currentThread().getName()} এ")
        delay(500L)
        "Done"
    }

    println("runBlocking এর পরে: $result")
}

আউটপুট দেখাবে যে সকল তিনটি println বিবরণ একই থ্রেডে করা হয়। runBlocking থ্রেড পরিবর্তন করে না বরং event-loop ব্যবহার করে একই থ্রেডের মধ্যে সহযোগিতামূলক মাল্টিটাস্কিং সংগঠিত করে।

কথায় runBlocking ব্যবহার করবেন

runBlocking তিনটি পরিস্থিতিতে যুক্তিযুক্ত: কনসোল অ্যাপ্লিকেশনে main() প্রবেশ বিন্দু, suspend ফাংশনের ইউনিট টেস্ট এবং সেতু — callback-ভিত্তিক বা blocking লাইব্রেরি থেকে suspend কোড ডাকা। প্রোডাক্শন Android কোডে, প্রধান থ্রেডে এটি ব্যবহার করা কঠোরভাবে নিষিদ্ধ

পরিস্থিতিপ্রযোজ্যতাবিপদ
main() কনসোল অ্যাপ্লিকেশনেরহ্যাঁকোনটি নেই — এটি প্রবেশ বিন্দু, থ্রেড UI ব্লক করে না
JUnit টেস্টহ্যাঁসর্বনিম্ন — টেস্ট সংজ্ঞা অনুসারে সিঙ্ক্রোনাস
Android UI থ্রেডনাANR, ল্যাগ, ইন্টারফেস জমাট যাওয়া
Callback → Coroutineহ্যাঁ, সাবধানের সঙ্গেদীর্ঘ অপারেশনে থ্রেড পুল ব্লকিং

Android টেস্টের জন্য, runBlocking এর পরিবর্তে kotlinx-coroutines-test এর TestDispatcher ব্যবহার করুন। এটি সময় নিয়ন্ত্রণ, স্বচালিত পরিষ্কার এবং টেস্ট বিচ্ছিন্নতা প্রদান করে।

runBlocking এর বিকল্প

অধিকাংশ পরিস্থিতিতে, runBlocking কে অ্যাসিঙ্ক্রোনাস বিকল্প দিয়ে প্রতিস্থাপিত করা যেতে পারে এবং উচিত। Android এর জন্য, এগুলো হল viewModelScope, lifecycleScope বা উপযুক্ত ডিস্প্যাচার সহ CoroutineScope। টেস্টের জন্য — TestCoroutineDispatcher এবং runTest।

kotlin
    // খারাপ: Android প্রধান থ্রেডে runBlocking
runBlocking(Dispatchers.Main) {
    val result = networkApi.fetchData()
    textView.setText(result)
}

// ভালো: lifecycleScope
lifecycleScope.launch {
    val result = withContext(Dispatchers.IO) { networkApi.fetchData() }
    textView.setText(result)
}

টেস্টের জন্য, বিকল্প হল kotlinx-coroutines-test এর runTest। এটি ভিরতুয়াল সময় সহ TestCoroutineScope তৈরি করে, যা বাস্তবিক অপেক্ষা ছাড়াই বিলম্ব পরীক্ষা করতে দেয়। এটি টেস্টগুলিকে দ্রুত করে এবং নির্দেশ্যক করে।

runBlocking ব্যবহারের উদাহরণ

সবচেয়ে সাধারণ পরিস্থিতি হল suspend ফাংশন পরীক্ষা করা। টেস্টে runBlocking আপনাকে আর্কিটেকচার পরিবর্তন ছাড়াই একটি কোরুটিন ফলাফলের জন্য সিঙ্ক্রোনাসলি অপেক্ষা করতে দেয়। দ্বিতীয় পরিস্থিতি হল callback API সহ লাইব্রেরি, যেখানে runBlocking এর মাধ্যমে suspend ফাংশনগুলি blocking প্রসঙ্গ থেকে ডাকা হয়।

kotlin
// runBlocking এর সাথে suspend ফাংশন পরীক্ষা
class RepositoryTest {
    @Test
    fun `fetchUser returns correct data`() {
        val repository = UserRepository(FakeApi())

        val result = runBlocking {
            repository.fetchUser("123")
        }

        assertEquals("John", result.name)
        assertEquals("john@test.com", result.email)
    }
}

callback এবং suspend দুনিয়ার মধ্যে সেতু নির্মাণের জন্য, callbacks এর পরিবর্তে runBlocking এর সঙ্গে CompletableDeferred ব্যবহার করুন — এটি অ্যাসিঙ্ক্রোনাস অপারেশন চেইনকে সরল করে এবং কোড পঠনিয়তা বাড়ায়।

ভুল ব্যবহারের বিপদ

runBlocking এর অনুচিত ব্যবহার ব্লকিং পদ্ধতি থেকে কোরুটিনে স্থানান্তরণ করার সময় সাধারণ ভুলগুলির একটি। প্রধান সমস্যাগুলি: Android এর প্রধান থ্রেডে কল করা, runBlocking কে একে অন্যের মধ্যে নেস্ট করা, অ্যাসিঙ্ক্রোনাস ফাংশনের মধ্যে ব্যবহার করা এবং runBlocking এর মাধ্যমে দীর্ঘ অপারেশন চালু করা।

  • ANR — Android এর প্রধান থ্রেডে runBlocking UI রেন্ডারিং 5 সেকেন্ডের বেশি জন্য ব্লক করে
  • ডেডলক — একই থ্রেডে একটি কোরুটিনের মধ্যে নেস্টেড runBlocking পারস্পরিক ব্লকিং সৃষ্টি করে
  • ডিস্প্যাচার দিব্যন্তি — ব্যাকগ্রাউন্ড থ্রেডে runBlocking এর মধ্যে Dispatchers.Main এর কোন Looper নেই এবং এক্সেপশন ছুড়ে দেয়
  • মেমোরি লিক — Activity/Fragment ধ্বংস হলে runBlocking স্বচালিতভাবে বাতিল হয় না

সুবর্ণ নিয়ম: runBlocking একটি সেতু, প্রতিস্থাপন নয়। এটি শুধুমাত্র blocking এবং non-blocking দুনিয়াকে সংযুক্ত করতে ব্যবহার করুন। অন্য সকল কাজের জন্য, launch, async বা lifecycleScope ব্যবহার করুন।

সাধারণ প্রশ্নাবলী

কেন runBlocking থ্রেড ব্লক করে যেখানে অন্য বিল্ডাররা করে না?

runBlocking একমাত্র বিল্ডার যা suspend ফাংশন নয়। এটি বর্তমান থ্রেডে একটি event-loop শুরু করে এবং সকল কোরুটিন শেষ না হতে নিয়ন্ত্রণ ফেরত দেয় না। launch এবং async তাড়াতাড়ি নিয়ন্ত্রণ ফেরত দেয়, কোরুটিনটি পছন্দে চালায়।

Android ViewModel এ runBlocking ব্যবহার করা যায়?

সুপারিশ নয়। ViewModel এর একটি নির্মিত viewModelScope আছে যা স্বচালিতভাবে কোরুটিন পরিচালনা করে এবং ধ্বংস হলে তাদের বাতিল করে। ViewModel এ runBlocking থ্রেড ব্লক করে এবং লাইফসাইকল বাতিলকরণে সাড়া দেয় না।

ইউনিট টেস্টে runBlocking এর পরিবর্তে কি ব্যবহার করবেন?

kotlinx-coroutines-test লাইব্রেরি থেকে runTest ব্যবহার করুন। এটি ভিরতুয়াল সময় নিয়ন্ত্রণ, স্বচালিত বাতিলকরণ এবং নির্দেশ্যক মানাগুল সহ TestCoroutineScope প্রদান করে।

runBlocking এ event-loop কি?

Event-loop runBlocking এর মধ্যে একটি ইভেন্ট প্রক্রিয়াকরণ চক্র। যখন একটি কোরুটিন স্থগিত হয় (যেমন delay()), event-loop একই থ্রেডে অন্য প্রস্তুত কোরুটিন চালানোতে স্যাইচ করে। এটি থ্রেড স্যাইচিং ছাড়াই মাল্টিটাস্কিং এর মায়াজাল সৃষ্টি করে।

runBlocking এর মধ্যে runBlocking ডাকলে কি হয়?

একই থ্রেডে নেস্টেড runBlocking একটি ডেডলক সৃষ্টি করে — বাইরের ব্লক ভিতরেরটির জন্য অপেক্ষা করে, কিন্তু ভিতরেরটি বাইরেরটি শেষ না হতে শুরু হতে পারে না। আলাদা থ্রেডে এটি অনুমত কিন্তু ডিবাগিং জটিলতার কারণে দৃঢ়ভাবে নিউৎসাহিত।

সারাংশ

  • runBlocking — একটি ব্লকিং Coroutine Builder, blocking এবং async কোডের মধ্যে সেতু
  • Event-loop runBlocking স্যাইচিং ছাড়াই একই থ্রেডে সহযোগিতামূলকভাবে কোরুটিন প্রক্রিয়া করে
  • অনুমত পরিস্থিতি — main(), JUnit টেস্ট, callback লাইব্রেরি থেকে সেতু
  • নিষিদ্ধ পরিস্থিতি — Android UI থ্রেড, নেস্টেড কল, দীর্ঘ অপারেশন
  • বিকল্প — lifecycleScope, viewModelScope, টেস্টের জন্য runTest
  • ANR ঝুঁকি — প্রধান থ্রেডে runBlocking 5 সেকেন্ড পর অ্যাপ্লিকেশন জমাট করে
  • প্রোডাক্শন Android কোডের জন্য, async বিল্ডার ব্যবহার করুন — runBlocking UI এর জন্য ডিজাইন করা হয়নি

আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব

IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।

প্রকল্প নিয়ে আলোচনা করুন

আরও পড়ুন