মোবাইল ডেভেলপমেন্টে Thread — এটি কী, প্রকার এবং থ্রেড ব্যবস্থাপনা

লেখক: IT Sectr প্রকাশিত: 2026-03-16 পড়ার সময়: 11 মিনিট

Thread — প্রসেসর সময়ের মৌলিক একক, যার নিজস্ব স্ট্যাক থাকে এবং এটি অন্যান্য থ্রেড থেকে স্বাধীনভাবে নির্বাহিত হয়। মোবাইল ডেভেলপমেন্টে থ্রেড ব্যবহার করা হয় কাজগুলো সমান্তরালভাবে সম্পাদনের জন্য, যাতে দীর্ঘ অপারেশনের সময় ইন্টারফেস প্রতিক্রিয়াশীল থাকে। Android java.lang.Thread, Executors এবং Kotlin Coroutines সমর্থন করে, iOS — Thread (Objective-C), GCD এবং OperationQueue সমর্থন করে। Android Thread Documentation অনুসারে, নেটিভ থ্রেড তৈরি করতে অপারেটিং সিস্টেমকে স্ট্যাকের জন্য ~1 MB বরাদ্দ করতে হয়।

মূল বিষয়

  • Thread — CPU শিডিউলিংয়ের ন্যূনতম একক: প্রতিটি থ্রেড স্বাধীন এবং এর নিজস্ব স্ট্যাক রয়েছে
  • থ্রেড তৈরি Android-এ ~1 MB এবং iOS-এ 512 KB স্ট্যাক প্রয়োজন, তাই পুল সরাসরি তৈরির চেয়ে বেশি কার্যকর
  • Android: Thread, Executors, HandlerThread, Coroutines — থ্রেড অ্যাবস্ট্রাকশনের চারটি স্তর
  • iOS: Thread (নিম্ন-স্তরের), GCD (DispatchQueue), OperationQueue (উচ্চ-স্তরের)
  • Thread safety — mutable ডেটাতে ভাগ করা অ্যাক্সেসের জন্য সিঙ্ক্রোনাইজেশন প্রয়োজন: locks, atomic, serial queues

Thread কী

Thread (নির্বাহ থ্রেড) — নির্দেশাবলীর একটি স্বাধীন ক্রম, যা অপারেটিং সিস্টেম CPU কোরের উপর শিডিউল করতে পারে। প্রতিটি প্রক্রিয়া (অ্যাপ্লিকেশন) অন্তত একটি থ্রেড — Main Thread ধারণ করে। অতিরিক্ত থ্রেড সমান্তরাল কাজ নির্বাহের জন্য তৈরি করা হয়। প্রতিটি থ্রেডের নিজস্ব প্রোগ্রাম স্ট্যাক (স্থানীয় ভেরিয়েবল সহ), ইন্সট্রাকশন কাউন্টার (PC) এবং রেজিস্টার থাকে। হিপ মেমোরি প্রক্রিয়ার সকল থ্রেডের জন্য ভাগ করা হয়।

মোবাইল OS-এ থ্রেড প্রিম্পটিভ মাল্টিটাস্কিং (preemptive multitasking) দ্বারা শিডিউল হয়: OS যেকোনো সময় থ্রেডের নির্বাহ বাধাগ্রস্ত করতে পারে এবং অন্যটিকে নিয়ন্ত্রণ দিতে পারে (context switch)। কন্টেক্সট সুইচ একটি ব্যয়বহুল অপারেশন (1-10 মাইক্রোসেকেন্ড), কারণ এতে CPU রেজিস্টার সংরক্ষণ/পুনরুদ্ধার, TLB আপডেট এবং ক্যাশ ফ্লাশ করা জড়িত। এই কারণেই অত্যধিক থ্রেড (শত এবং হাজার) কর্মক্ষমতা খারাপ করে — OS নির্বাহের চেয়ে সুইচিংয়ে বেশি সময় ব্যয় করে।

থ্রেড এবং প্রক্রিয়া — ভিন্ন ধারণা। প্রক্রিয়া — বরাদ্দকৃত ভার্চুয়াল মেমোরি সহ অ্যাপ্লিকেশনের একটি ইনস্ট্যান্স। প্রক্রিয়ার ভিতরে থ্রেড এই মেমোরি অন্যান্য থ্রেডের সাথে ভাগ করে। Android-এ অ্যাপ্লিকেশনের প্রতিটি উপাদান (Activity, Service, BroadcastReceiver) একটি প্রক্রিয়ায় কাজ করে, কিন্তু বিভিন্ন থ্রেডে নির্বাহিত হতে পারে। iOS অ্যাপ্লিকেশনও GCD বা Thread-এর মাধ্যমে অতিরিক্ত থ্রেড তৈরির ক্ষমতা সহ একটি প্রক্রিয়া।

থ্রেডের জীবনচক্র: অবস্থা এবং পরিবর্তন

প্রত্যেক থ্রেড Java/Kotlin (Android) এবং NSThread (iOS)-এ পাঁচটি অবস্থার মধ্য দিয়ে যায়: New (তৈরি), Runnable (নির্বাহের জন্য প্রস্তুত), Running (CPU-তে নির্বাহিত), Blocked/Waiting (সম্পদ বা বিজ্ঞপ্তির অপেক্ষা), Terminated (সমাপ্ত)। অবস্থার মধ্যে পরিবর্তন OS শিডিউলার এবং সিঙ্ক্রোনাইজেশন প্রিমিটিভ দ্বারা পরিচালিত হয়। ডেভেলপার থ্রেড প্রায়োরিটি (Thread.setPriority()) এবং এর অবস্থা (sleep, join, interrupt) প্রভাবিত করতে পারেন।

Android-এ থ্রেড Blocked অবস্থায় যায় যখন ব্যস্ত মনিটর (synchronized) ধরার চেষ্টা করে, Object.wait() বা Thread.sleep() কল করে। iOS-এ — NSCondition.wait(), pthread_cond_wait() বা dispatch_semaphore_wait() কল করলে। Blocked অবস্থায় থ্রেড CPU ব্যবহার করে না, কিন্তু মেমোরি (স্ট্যাক) ধরে রাখে। থ্রেড অন্য থ্রেড থেকে বাধাপ্রাপ্ত (interrupted) হতে পারে, InterruptedException (Java) বা isCancelled (Kotlin Coroutines) পেয়ে।

অবস্থাবর্ণনাপরিবর্তন পদ্ধতি
Newথ্রেড তৈরি হয়েছে কিন্তু শুরু হয়নিThread() কনস্ট্রাক্টর
Runnableথ্রেড নির্বাহের জন্য প্রস্তুত, CPU-র অপেক্ষায়thread.start()
Runningথ্রেড CPU কোরে নির্বাহিতOS শিডিউলার
Blocked/Waitingথ্রেড সম্পদ, মনিটর বা বিজ্ঞপ্তির অপেক্ষায়synchronized, wait(), sleep()
Terminatedথ্রেড run() সম্পন্ন করেছে বা বাধাপ্রাপ্ত হয়েছেrun() সম্পন্ন, interrupt()

Context Switch এবং এর খরচ

Context switch (কন্টেক্সট সুইচ) — অপারেশন যেখানে OS বর্তমান থ্রেডের অবস্থা (রেজিস্টার, PC, TLB) সংরক্ষণ করে এবং অন্যটির সংরক্ষিত অবস্থা লোড করে। মোবাইল সিস্টেমে (Linux + ART, iOS-এর জন্য XNU) context switch-এ 1-10 মাইক্রোসেকেন্ড সময় লাগে। যদি থ্রেড 100 মাইক্রোসেকেন্ডে কাজ করে এবং context switch-এ 5 লাগে, তাহলে 5% সময় নষ্ট হয়। context switch কমানোর জন্য iOS work stealing সহ GCD ব্যবহার করে, Android — fixedThreadCount সহ পুল।

Android-এ Thread: Thread থেকে Coroutines পর্যন্ত

Android নিম্ন-স্তরের java.lang.Thread থেকে আধুনিক করুটিন পর্যন্ত বিবর্তিত হয়েছে। অ্যাবস্ট্রাকশনের প্রতিটি স্তর কম ওভারহেডে বেশি ক্ষমতা দেয়। Thread — মৌলিক শ্রেণী, কিন্তু এর সরাসরি তৈরি সুপারিশ করা হয় না: নতুন থ্রেড পুল দ্বারা পরিচালিত হয় না, এর মনিটরিং এবং বাতিল করা কঠিন। AsyncTask (API 30 থেকে deprecated) এক ধাপ এগিয়ে ছিল, কিন্তু মেমোরি লিক এবং কনফিগারেশন হ্যান্ডলিংয়ের অসুবিধায় ভুগছিল।

HandlerThread — Looper সহ Thread-এর একটি বিশেষ উপশ্রেণী, যা বার্তা কিউ প্রক্রিয়া করতে পারে। এটি পটভূমি থ্রেডে অনুক্রমিক কাজের জন্য ব্যবহৃত হয়, যেমন Room বা ফাইলে ডেটা লেখা। HandlerThread start() কল করে তৈরি হয়, তারপর Handler(handlerThread.looper) এর মাধ্যমে বার্তা এবং Runnable পাঠানো যায়। handlerThread.quit() কল Looper বন্ধ করে এবং থ্রেড শেষ করে।

kotlin
// Android: Thread, HandlerThread এবং Executors
import android.os.Handler
import android.os.HandlerThread
import java.util.concurrent.Executors

class ThreadExample {

    // 1. সরাসরি Thread তৈরি (সুপারিশ করা হয় না)
    fun directThread() {
        val thread = Thread(Runnable {
            Thread.sleep(1000)
            print("Direct thread executed")
        })
        thread.start()
    }

    // 2. HandlerThread অনুক্রমিক পটভূমি কাজের জন্য
    fun handlerThreadExample() {
        val handlerThread = HandlerThread("BackgroundQueue")
        handlerThread.start()

        val handler = Handler(handlerThread.looper)
        handler.post {
            // পটভূমি থ্রেডে অনুক্রমিক নির্বাহ
            Thread.sleep(500)
            print("HandlerThread: কাজ সম্পন্ন")
        }

        // থ্রেড বন্ধ করা (যখন কাজ শেষ হয় তখন সম্পাদিত)
        handlerThread.quitSafely()
    }

    // 3. Executors — থ্রেড পুল
    fun executorExample() {
        val executor = Executors.newFixedThreadPool(4)
        for (i in 1..10) {
            executor.execute {
                print("Task $i on thread ${Thread.currentThread().getName()}")
            }
        }
        executor.shutdown()
    }

    // 4. Kotlin Coroutines — আধুনিক মান
    suspend fun coroutineExample() = kotlinx.coroutines.withContext(
        kotlinx.coroutines.Dispatchers.Default
    ) {
        print("Coroutine on thread: ${Thread.currentThread().getName()}")
    }
}

উদাহরণ ThreadExample Android-এ থ্রেড অ্যাবস্ট্রাকশনের চারটি স্তর দেখায়। সরাসরি Thread তৈরি — সবচেয়ে নিম্ন-স্তরের এবং অকার্যকর পদ্ধতি। HandlerThread পটভূমিতে অনুক্রমিক কাজের জন্য উপযোগী। Executors.newFixedThreadPool(4) 10টি কাজের সমান্তরাল নির্বাহের জন্য 4টি থ্রেডের পুল তৈরি করে। Kotlin Coroutines Dispatchers.Default সহ — আধুনিক, কার্যকর এবং নিরাপদ উপায়।

HandlerThread: অনুক্রমিক পটভূমি কাজ

HandlerThread — অন্তর্নির্মিত Looper এবং বার্তা কিউ সহ Thread-এর একটি বিশেষ উপশ্রেণী। এটি start() কল করে তৈরি হয়, তারপর Handler(handlerThread.looper) এর মাধ্যমে Runnable এবং বার্তা পাঠানো যায়। HandlerThread কাজগুলো কঠোরভাবে অনুক্রমিকভাবে সম্পাদন করে — পরবর্তী কাজ পূর্ববর্তীটি শেষ না হওয়া পর্যন্ত শুরু হয় না। এটি Room বা ফাইলে ডেটা লেখার জন্য সুবিধাজনক, যেখানে অপারেশনের ক্রম গুরুত্বপূর্ণ। quitSafely() কল বর্তমান কাজ শেষ হওয়ার পর Looper বন্ধ করে।

iOS-এ Thread: Thread, GCD এবং OperationQueue

iOS-ও থ্রেড নিয়ে কাজ করার তিনটি স্তর প্রদান করে। Thread (Swift-এ Thread, Objective-C-এ NSThread) — নিম্ন-স্তরের API, যা সরাসরি নেটিভ থ্রেড তৈরি করে। GCD (Grand Central Dispatch) DispatchQueue-এর মাধ্যমে — iOS ডেভেলপারদের জন্য প্রধান টুল, যা স্বয়ংক্রিয়ভাবে থ্রেড পুল পরিচালনা করে। OperationQueue — নির্ভরতা, প্রায়োরিটি এবং বাতিলকরণের সমর্থন সহ GCD-এর উপর উচ্চ-স্তরের অ্যাবস্ট্রাকশন।

আধুনিক iOS ডেভেলপমেন্টে Thread-এর সরাসরি ব্যবহার অত্যন্ত বিরল — GCD স্বয়ংক্রিয় মেমোরি এবং থ্রেড পরিচালনার সাথে সমস্ত প্রয়োজনীয় ক্ষমতা প্রদান করে। Thread শুধুমাত্র নির্দিষ্ট ক্ষেত্রে ব্যবহৃত হয়: thread-local storage (threadDictionary) সেট করা, পটভূমি থ্রেডের জন্য RunLoop তৈরি করা, বা C-লাইব্রেরির সাথে ইন্টিগ্রেশন যা pthread_t আশা করে।

swift
import Foundation

class ThreadManager {

    // 1. Thread (নিম্ন-স্তরের)
    func createThread() {
        let thread = Thread {
            // কোড নতুন থ্রেডে নির্বাহিত হয়
            print("Current thread: \(Thread.current)")
        }
        thread.name = "com.app.worker"
        thread.qualityOfService = .utility
        thread.start()
    }

    // 2. GCD — DispatchQueue
    func gcdExample() {
        // সমান্তরাল কিউ
        let queue = DispatchQueue(label: "com.app.concurrent",
                                 qos: .utility,
                                 attributes: .concurrent)

        queue.async {
            print("GCD async task")
        }

        // লেখা সিঙ্ক্রোনাইজেশনের জন্য Barrier
        queue.async(flags: .barrier) {
            // লেখার সময় এক্সক্লুসিভ অ্যাক্সেস
            print("Barrier write: exclusive access")
        }
    }

    // 3. নির্ভরতা সহ OperationQueue
    func operationQueueExample() {
        let queue = OperationQueue()
        queue.maxConcurrentOperationCount = 2
        queue.qualityOfService = .background

        let download = BlockOperation {
            print("Downloading...")
        }
        let process = BlockOperation {
            print("Processing...")
        }
        let save = BlockOperation {
            print("Saving...")
        }

        // নির্ভরতা: download -> process -> save
        process.addDependency(download)
        save.addDependency(process)

        queue.addOperations([download, process, save], waitUntilFinished: false)
    }
}

// GCD barrier-এর মাধ্যমে Thread-safe সংগ্রহ
class ThreadSafeArray<T> {
    private var array: [T] = []
    private let queue = DispatchQueue(label: "com.app.concurrent",
                                       attributes: .concurrent)

    var count: Int {
        return queue.sync { array.count } // concurrent read
    }

    func append(_ element: T) {
        queue.async(flags: .barrier) { // exclusive write
            self.array.append(element)
        }
    }
}

শ্রেণী ThreadSafeArray GCD barrier-এর মাধ্যমে Concurrent Read / Exclusive Write প্যাটার্ন প্রদর্শন করে। queue.sync{} এর মাধ্যমে পড়া একাধিক থ্রেড থেকে সমান্তরালভাবে নির্বাহিত হয়। queue.async(flags: .barrier) এর মাধ্যমে লেখা লেখা শেষ না হওয়া পর্যন্ত অন্যান্য সকল অপারেশন (পড়া এবং লেখা উভয়) ব্লক করে। এটি synchronized-ব্লকের চেয়ে বেশি কার্যকর, কারণ এটি পাঠকদের ব্লক করে না যতক্ষণ না লেখা হচ্ছে।

iOS Thread vs GCD: কখন সরাসরি Thread ব্যবহার করবেন

iOS-এ সরাসরি Thread ব্যবহার তিনটি ক্ষেত্রে যুক্তিযুক্ত: thread-local storage (Thread.current.threadDictionary) — থ্রেডের সাথে সংযুক্ত ডেটা সংরক্ষণের জন্য; পটভূমি থ্রেডে performSelector:onThread: সহ বিশেষ RunLoop তৈরি করার জন্য; C/C++ লাইব্রেরির সাথে ইন্টিগ্রেশনের জন্য যা pthread_t আশা করে। অন্যান্য সকল ক্ষেত্রে GCD DispatchQueue-এর মাধ্যমে ভাল — এটি স্বয়ংক্রিয়ভাবে থ্রেড পুল এবং শক্তি খরচ পরিচালনা করে।

থ্রেড সিঙ্ক্রোনাইজেশন: locks, atomic, serial queues

Race condition (রেস কন্ডিশন) তখন ঘটে যখন দুই বা ততোধিক থ্রেড একসাথে ভাগ করা ডেটা অ্যাক্সেস করে, এবং কমপক্ষে একটি থ্রেড লেখে। ফলাফল নির্বাহের ক্রম (timing) এর উপর নির্ভর করে এবং অপ্রত্যাশিত। race condition প্রতিরোধে সিঙ্ক্রোনাইজেশন প্রিমিটিভ ব্যবহার করা হয়। মোবাইল ডেভেলপমেন্টে লক (synchronized, NSLock), অ্যাটমিক অপারেশন (AtomicInteger, iOS atomic-প্রপার্টি) এবং কিউ (serial queue) উপলব্ধ।

প্রিমিটিভ নির্বাচন পরিস্থিতির উপর নির্ভর করে। সাধারণ কাউন্টার এবং ফ্ল্যাগের জন্য অ্যাটমিক অপারেশন (AtomicInteger, atomic property) যথেষ্ট। একাধিক অপারেশন বিশিষ্ট ক্রিটিকাল সেকশনের জন্য — লক (synchronized, NSLock)। জটিল ডেটা স্ট্রাকচারের জন্য — serial DispatchQueue বা GCD barrier। লক বোঝা সহজ, কিন্তু deadlock এবং livelock-এর জন্য সংবেদনশীল। কিউ বেশি জটিল কিন্তু নিরাপদ।

kotlin
// Android/Kotlin-এ সিঙ্ক্রোনাইজেশন
import java.util.concurrent.atomic.AtomicInteger
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock

class Counter {

    // 1. AtomicInteger — সাধারণ কাউন্টারের জন্য
    private val atomicCount = AtomicInteger(0)
    fun incrementAtomic() = atomicCount.incrementAndGet()

    // 2. synchronized — ক্রিটিকাল সেকশনের জন্য
    @Synchronized
    fun synchronizedOperation() {
        // একবারে শুধুমাত্র একটি থ্রেড
        doWork()
    }

    // 3. করুটিন থেকে Mutex — suspend-safe
    private val mutex = Mutex()
    suspend fun mutexOperation() {
        mutex.withLock {
            // সুরক্ষিত কোড — থ্রেড-নিরাপদ
            doWork()
        }
    }

    private fun doWork() { /* critical section */ }
}

// Deadlock উদাহরণ: A, B-কে লক করে, B, A-কে লক করে
class DeadlockExample {
    private val lockA = Any()
    private val lockB = Any()

    fun methodA() = synchronized(lockA) {
        Thread.sleep(100)
        synchronized(lockB) { print("OK") }
    }

    fun methodB() = synchronized(lockB) {
        Thread.sleep(100)
        synchronized(lockA) { print("OK") }
    }
}

Counter সিঙ্ক্রোনাইজেশনের তিনটি পদ্ধতি প্রদর্শন করে। AtomicInteger.incrementAndGet() — লক ছাড়া অ্যাটমিক অপারেশন (CAS)। @Synchronized — Java-র অন্তর্নির্মিত মনিটর, পুরো অবজেক্ট লক করে। Mutex.withLock — করুটিন মিউটেক্স, থ্রেড ব্লক করার পরিবর্তে করুটিন থামায় (আরও কার্যকর)। DeadlockExample ক্লাসিক deadlock দেখায়: দুটি থ্রেড ভিন্ন ক্রমে লক ধরে।

Thread Pools: কেন Executors Thread-এর চেয়ে ভাল

Thread Pool (থ্রেড পুল) — পূর্বে তৈরি থ্রেডের একটি সেট, যা কাজ সম্পাদনের জন্য পুনরায় ব্যবহৃত হয়। প্রতিটি কাজের জন্য নতুন থ্রেড তৈরি করার (ব্যয়বহুল) পরিবর্তে পুল পুল থেকে একটি খালি থ্রেড নেয়। যদি খালি থ্রেড না থাকে, কাজটি কিউতে রাখা হয়। পুল স্বয়ংক্রিয়ভাবে আকার পরিচালনা করে: পিক লোডে নতুন থ্রেড তৈরি হয়, নিষ্ক্রিয় থ্রেড শেষ হয়। এটি থ্রেড তৈরির ওভারহেড দশগুণ কমিয়ে দেয়।

Android-এ Executors.newFixedThreadPool(4) 4টি থ্রেডের পুল তৈরি করে। যদি একসাথে 10টি কাজ আসে, 4টি সাথে সাথে নির্বাহ শুরু হয়, 6টি কিউতে অপেক্ষা করে। Executors.newCachedThreadPool() প্রয়োজন অনুসারে থ্রেড তৈরি করে (সীমা ছাড়া) এবং 60 সেকেন্ড পর নিষ্ক্রিয় থ্রেড শেষ করে। iOS-এর জন্য GCD স্বয়ংক্রিয়ভাবে গ্লোবাল কিউর পুল সরবরাহ করে, যার আকার CPU কোরের সংখ্যা এবং বর্তমান লোডের সাথে সামঞ্জস্যপূর্ণ।

Kotlin Coroutines-এ থ্রেড পুল ডিসপ্যাচারের ভিতরে লুকানো থাকে। Dispatchers.Default CPU কোরের সংখ্যার সমান আকারের পুল ব্যবহার করে (ন্যূনতম 2)। Dispatchers.IO — 64 থ্রেড (শতাধিক IO-bound কাজের জন্য যথেষ্ট, কারণ অধিকাংশ ইনপুট-আউটপুটের অপেক্ষা করবে, CPU ব্যবহার করবে না)। প্রতিটি ডিসপ্যাচার স্বয়ংক্রিয়ভাবে লোড অনুসারে পুল স্কেল করে, নিষ্ক্রিয়তায় ব্যাটারি শক্তি বাঁচায়।

প্রায়শই জিজ্ঞাসিত প্রশ্ন

মোবাইল ডেভেলপমেন্টে Thread কী?

Thread — অ্যাপ্লিকেশনে কোড নির্বাহের মৌলিক একক। প্রতিটি প্রক্রিয়ায় একাধিক থ্রেড থাকতে পারে, যা মেমোরি ভাগ করে কিন্তু নিজস্ব স্ট্যাক সহ। মোবাইল ডেভেলপমেন্টে থ্রেড ব্যবহার করা হয় UI ব্লক না করে সমান্তরাল কাজ নির্বাহের জন্য। Android Thread, Executors, HandlerThread এবং Coroutines ব্যবহার করে। iOS Thread, GCD (DispatchQueue) এবং OperationQueue ব্যবহার করে।

কেন সরাসরি Thread তৈরি করার পরামর্শ দেওয়া হয় না?

Thread তৈরি Android-এ ~1 MB এবং iOS-এ ~512 KB স্ট্যাক বরাদ্দের প্রয়োজন — এটি একটি ব্যয়বহুল অপারেশন। 1000 কাজের জন্য 1000 থ্রেডের সরাসরি তৈরি শুধুমাত্র স্ট্যাকের জন্য ~1 GB প্রয়োজন হবে, plus context switch-এর ওভারহেড। Thread-এর পরিবর্তে পুল (Executors, GCD) বা করুটিন ব্যবহার করুন — তারা থ্রেড পুনরায় ব্যবহার করে, ওভারহেড দশগুণ কমিয়ে।

Race condition কী এবং কীভাবে এড়াবেন?

Race condition — একাধিক থ্রেড দ্বারা লেখার সাথে একসাথে ভাগ করা ডেটা অ্যাক্সেসে অপ্রত্যাশিত আচরণ। তিন উপায়ে এড়ানো যায়: অ্যাটমিক টাইপ (AtomicInteger), লক (synchronized, NSLock) ব্যবহার, বা কিউ (DispatchQueue serial, Kotlin-এ Actor) দ্বারা অ্যাক্সেস সিরিয়ালাইজ করা। সর্বোত্তম অভ্যাস — ভাগ করা mutable অবস্থা কম করা এবং immutability ব্যবহার করা।

Thread এবং করুটিনের মধ্যে পার্থক্য কী?

Thread — নেটিভ সিস্টেম অবজেক্ট, যা ~1 MB স্ট্যাক নেয় এবং OS কোরের সাথে আবদ্ধ। করুটিন — Kotlin-এর হালকা নির্বাহ একক, যা নির্দিষ্ট থ্রেডের সাথে আবদ্ধ নয় এবং ব্লকিং ছাড়া স্থগিত (suspend) হতে পারে। একটি থ্রেড হাজার হাজার করুটিন নির্বাহ করতে পারে। করুটিন মেমোরিতে বেশি কার্যকর এবং callbacks ছাড়া অ্যাসিঙ্ক্রোনাস কোড লেখার অনুমতি দেয়।

মোবাইল অ্যাপ্লিকেশনে deadlock কীভাবে ধরবেন?

Deadlock ANR ছাড়া অ্যাপ্লিকেশনের সম্পূর্ণ হ্যাং হিসাবে প্রকাশ পায়। Android-এ Thread.getAllStackTraces() ব্যবহার করুন — দুটি থ্রেড একে অপরের লকের অপেক্ষায় থাকবে। iOS-এ — Thread.callStackSymbols। টুল: Android Studio Profiler (Threads tab), Instruments (iOS, Thread State View)। প্রতিরোধ: লক নির্দিষ্ট ক্রমে ধরুন, টাইমআউট সহ tryLock ব্যবহার করুন।

সারসংক্ষেপ

  • Thread — CPU-র ন্যূনতম একক: নিজস্ব স্ট্যাক সহ স্বাধীন নির্বাহ, হিপ মেমোরি ভাগ করা
  • পাঁচটি অবস্থা থ্রেডের: New, Runnable, Running, Blocked/Waiting, Terminated
  • Android বিবর্তিত: Thread → AsyncTask → Executors → HandlerThread → Coroutines
  • iOS প্রদান করে: Thread, GCD (DispatchQueue) এবং OperationQueue — নিম্ন থেকে উচ্চ স্তর
  • Race condition লক (synchronized, NSLock), অ্যাটমিক টাইপ এবং serial-কিউ দ্বারা সমাধান করা হয়
  • Deadlock ক্রস-লকিং থেকে উদ্ভূত — নির্দিষ্ট ক্রম দ্বারা প্রতিরোধ করা হয়
  • Thread Pool নতুন Thread তৈরির চেয়ে বেশি কার্যকর: থ্রেড পুনরায় ব্যবহার করে, context switch ওভারহেড কমায়

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

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

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

আরও পড়ুন