Sobes.tech
Middle

Kako implementirati višestruko izvršavanje u Kotlinu?

sobes.tech АИ

Одговор од АИ

Многопоточност у Kotlin-у може се реализовати на више начина:

  1. Стандардни Java потоци (Threads):

    // Реализација интерфејса Runnable
    class MyRunnable : Runnable {
        override fun run() {
            // Код који ће се извршавати у посебном потоку
            println("Здраво из потока: ${Thread.currentThread().name}")
        }
    }
    
    fun main() {
        // Креирање экземпляра Runnable
        val runnable = MyRunnable()
        // Креирање објекта Thread са Runnable
        val thread = Thread(runnable)
        // Покретање потока
        thread.start()
    }
    

    Или коришћењем lambda израза:

    fun main() {
        val thread = Thread {
            // Код који ће се извршавати у посебном потоку
            println("Здраво из потока: ${Thread.currentThread().name}")
        }
        thread.start()
    }
    
  2. Kotlin Coroutines (Корутине): Ово је препорученији и савременији приступ у Kotlin-у, који пружа лакеје мулти-тхрединг.

    import kotlinx.coroutines.*
    
    fun main() = runBlocking {
        // Креирање нове корутине у глобалном scope-у
        launch {
            delay(1000L) // Не блокирајуће кашњење од 1 секунде
            println("Здраво из корутине")
        }
        // Основни поток наставља рад
        println("Здраво из главног потока")
        // runBlocking чека завршетак свих унутрашњих корутина
    }
    

    Примери коришћења различитих градитеља корутина:

    • launch: Покреће нову корутину без повратне вредности.
    import kotlinx.coroutines.*
    
    fun main() = runBlocking {
        launch {
            println("Ова корутина једноставно извршава акцију")
        }
    }
    
    • async: Покреће нову корутину која враћа резултат помоћу Deferred.
    import kotlinx.coroutines.*
    
    fun main() = runBlocking {
        val deferredResult = async {
            delay(1000L)
            "Резултат из корутине"
        }
        val result = deferredResult.await() // Чека резултат
        println(result)
    }
    
  3. RxKotlin/RxJava: Реактивно програмирање такође омогућава рад са асинхроним операцијама и више потеза, користећи планерe (Schedulers).

    import io.reactivex.rxjava3.core.Observable
    import io.reactivex.rxjava3.schedulers.Schedulers
    
    fun main() {
        Observable.just("Асинхрона ставка")
            .subscribeOn(Schedulers.io()) // Извршавање претплате у I/O потоку
            .observeOn(Schedulers.computation()) // Посматрање резултата у рачунарском потоку
            .subscribe { item ->
                println("Добијено: $item на потоку ${Thread.currentThread().name}")
            }
    
        Thread.sleep(2000) // Чекање на завршетак асинхроних операција
    }
    

Избор методе зависи од конкретног задатка. За већину савремених Kotlin апликација, корутине су пожељније због њихове лакоће, једноставности коришћења и уграђене подршке у језику. Java потоци могу бити погодни за ниско-ниво контролу, а реактивне библиотеке за рад са токовима података.