Middle
Kako implementirati višestruko izvršavanje u Kotlinu?
sobes.tech АИ
Одговор од АИ
Многопоточност у Kotlin-у може се реализовати на више начина:
-
Стандардни 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() } -
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) } -
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 потоци могу бити погодни за ниско-ниво контролу, а реактивне библиотеке за рад са токовима података.