Στο Kotlin, τα coroutines είναι μία από τις πιο εμβληματικές λειτουργίες της γλώσσας που κάνουν τον ασύγχρονο προγραμματισμό απλό, αναγνώσιμο και αποδοτικό. Σε σύγκριση με τα παραδοσιακά threads ή callbacks, τα coroutines δημιουργούν ελαφριές (lightweight) εργασίες – χιλιάδες coroutines μπορούν να εκτελούνται στο ίδιο thread, ενώ τα κλασικά threads καταναλώνουν γρήγορα πόρους συστήματος. Από το 2026, τα coroutines έχουν γίνει πρότυπο σε Android (ενσωμάτωση Jetpack Compose, Room, Retrofit), backend (Ktor server-side ασύγχρονο), Kotlin Multiplatform (κοινή δικτύωση) και ακόμη και εφαρμογές desktop. Σε συνδυασμό με structured concurrency, flows και διαχείριση εξαιρέσεων, γίνεται πολύ εύκολο να γράψετε robost ασύγχρονο κώδικα.
Στο Google, αναζητήσεις όπως "Kotlin coroutines", "Kotlin async await", "Kotlin flow", "Kotlin launch vs async" είναι μεταξύ των υψηλότερων σε όγκο θεμάτων Kotlin στην Τουρκία και παγκοσμίως. Η καλή κατανόηση των coroutines είναι απαραίτητη για κλήσεις δικτύου χωρίς μπλοκάρισμα UI, εκτέλεση παράλληλων εργασιών και reactive programming (Flow). Σε αυτόν τον οδηγό, θα καλύψουμε βήμα-βήμα από βασικούς coroutine builders μέχρι Flows, διαχείριση εξαιρέσεων και ρεαλιστικό παράδειγμα έργου.
Γιατί Πρέπει να Μάθετε Coroutines; (Προοπτική 2026)
Εγκατάσταση και Εξαρτήσεις
Για έργο Android:
Για γενικό/multiplatform kotlinx-coroutines-core.
Βασικές Έννοιες
Structured Concurrency και Scopes
Μην χρησιμοποιείτε GlobalScope – unstructured, κίνδυνος memory leak.
Στο Android, scope ViewModel:
Διαχείριση Εξαιρέσεων
Flow: Reactive Streams
Cold stream – ξεκινά όταν συλλέγεται. Υπάρχουν επίσης StateFlow και SharedFlow.
StateFlow (ιδανικό για Compose):
Πραγματικό Παράδειγμα Έργου: Προσομοίωση Ασύγχρονης Κλήσης API
Απλή προσομοίωση εφαρμογής "Καιρός" – παράλληλες κλήσεις δικτύου.
Ενσωμάτωση Android/Compose (σύντομο παράδειγμα):
Προχωρημένα Θέματα και Συμβουλές
Συμπέρασμα και Πρακτικές Συμβουλές
Τα coroutines είναι η υπερδύναμη του Kotlin στον ασύγχρονο κόσμο – απαλλαγείτε από callback hell, γράψτε καθαρό και γρήγορο κώδικα. Για πρακτική:
Με αυτόν τον οδηγό, θα έχετε κατανοήσει πλήρως τα coroutines. Σε πραγματικά έργα (κλήσεις δικτύου, εργασίες φόντου) τα coroutines θα σας δώσουν μεγάλη απόδοση και αναγνωσιμότητα. Για λεπτομέρειες παραδείγματος έργου ή συγκεκριμένο τμήμα, αφήστε σχόλιο! Καλή επιτυχία στις εφαρμογές που θα αναπτύξετε με Kotlin το 2026.
Στο Google, αναζητήσεις όπως "Kotlin coroutines", "Kotlin async await", "Kotlin flow", "Kotlin launch vs async" είναι μεταξύ των υψηλότερων σε όγκο θεμάτων Kotlin στην Τουρκία και παγκοσμίως. Η καλή κατανόηση των coroutines είναι απαραίτητη για κλήσεις δικτύου χωρίς μπλοκάρισμα UI, εκτέλεση παράλληλων εργασιών και reactive programming (Flow). Σε αυτόν τον οδηγό, θα καλύψουμε βήμα-βήμα από βασικούς coroutine builders μέχρι Flows, διαχείριση εξαιρέσεων και ρεαλιστικό παράδειγμα έργου.
Γιατί Πρέπει να Μάθετε Coroutines; (Προοπτική 2026)
- Απόδοση: Χαμηλό overhead για χιλιάδες ταυτόχρονες εργασίες – δεν χρειάζονται thread pools.
- Αναγνωσιμότητα: Ο κώδικας γράφεται σειριακά (όπως async/await) αλλά λειτουργεί non-blocking.
- Structured concurrency: Scopes με αυτόματη ακύρωση και διάδοση σφαλμάτων – αποτρέπει memory leaks.
- Multiplatform: Android, iOS, JS, Native και server-side (Ktor) ίδιο coroutine API.
- Δημοφιλή χρήση: Κλήσεις Retrofit, ερωτήματα Room, διαχείριση κατάστασης Compose, handlers διαδρομών Ktor.
- Ενημέρωση 2026: Με το Kotlin 2.0, καλύτερες βελτιστοποιήσεις μεταγλωττιστή και βελτιώσεις Flow.
Εγκατάσταση και Εξαρτήσεις
Για έργο Android:
Κώδικας [Επιογή]
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0") // ή implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.0") //Για γενικό/multiplatform kotlinx-coroutines-core.
Βασικές Έννοιες
- CoroutineScope: Διαχειρίζεται τον κύκλο ζωής των coroutines.
- Dispatcher: Καθορίζει σε ποιο thread θα εκτελεστεί (Main, IO, Default).
- Builders: launch (fire-and-forget), async (επιστρέφει τιμή, await).
Κώδικας [Επιογή]
import kotlinx.coroutines.*
fun main() = runBlocking { // Main scope - μπλοκάρει αλλά ιδανικό για τεστ
launch { // Ξεκινά νέο coroutine (fire-and-forget)
delay(1000L) // Non-blocking αναμονή (δεν κάνει thread sleep!)
println("Γεια σου Coroutines! Thread: ${Thread.currentThread().name}")
}
println("Συνέχεια χωρίς αναμονή... Thread: ${Thread.currentThread().name}")
val deferred = async { // Coroutine που επιστρέφει τιμή
delay(500L)
"Το αποτέλεσμα είναι έτοιμο"
}
println("Αποτέλεσμα async: ${deferred.await()}") // Περιμένει και παίρνει το αποτέλεσμα
}Κώδικας [Επιογή]
launch(Dispatchers.IO) { // Για δικτύωση, αρχεία
// Κλήση δικτύου...
}
launch(Dispatchers.Main) { // Για ενημέρωση UI Android
// textView.text = "Ενημερώθηκε"
}
launch(Dispatchers.Default) { // Για CPU-intensive εργασίες
// Υπολογισμός...
}Structured Concurrency και Scopes
Κώδικας [Επιογή]
val scope = CoroutineScope(Dispatchers.Default)
val job = scope.launch {
launch { // Παιδί coroutine
delay(1000)
println("Παιδί ολοκληρώθηκε")
}
delay(500)
println("Γονέας συνεχίζει")
}
job.cancel() // Όλα τα παιδιά ακυρώνονται αυτόματα - structured!Μην χρησιμοποιείτε GlobalScope – unstructured, κίνδυνος memory leak.
Στο Android, scope ViewModel:
Κώδικας [Επιογή]
viewModelScope.launch { ... } // Αυτόματη ακύρωση όταν καταστραφεί η Activity
lifecycleScope.launch { ... } // Συνειδητοποιημένο κύκλου ζωήςΔιαχείριση Εξαιρέσεων
Κώδικας [Επιογή]
val handler = CoroutineExceptionHandler { _, exception ->
println("Σφάλμα πιάστηκε: $exception")
}
scope.launch(handler) {
throw Exception("Κάτι πήγε στραβά!")
} // Ή με SupervisorJob απομονώστε σφάλματα παιδιώνFlow: Reactive Streams
Cold stream – ξεκινά όταν συλλέγεται. Υπάρχουν επίσης StateFlow και SharedFlow.
Κώδικας [Επιογή]
import kotlinx.coroutines.flow.*
fun numberFlow(): Flow<Int> = flow {
for (i in 1..5) {
delay(500)
emit(i) // Εκπέμπει
}
}
fun main() = runBlocking {
numberFlow()
.map { it * it } // Μετασχηματίζει
.filter { it % 2 == 0 } // Φιλτράρει
.collect { println(it) } // 4, 16 (ζυγοί τετράγωνοι)
// Σφάλμα και ολοκλήρωση
numberFlow()
.onEach { println(it) }
.onCompletion { println("Η ροή τελείωσε") }
.catch { println("Σφάλμα: $it") }
.collect()
}StateFlow (ιδανικό για Compose):
Κώδικας [Επιογή]
val state = MutableStateFlow("Αρχή")
state.value = "Ενημερώθηκε" // Το UI ανανεώνεται αυτόματαΠραγματικό Παράδειγμα Έργου: Προσομοίωση Ασύγχρονης Κλήσης API
Απλή προσομοίωση εφαρμογής "Καιρός" – παράλληλες κλήσεις δικτύου.
Κώδικας [Επιογή]
import kotlinx.coroutines.*
data class City(val name: String, val temperature: Int)
suspend fun getTemperature(city: String): City = withContext(Dispatchers.IO) {
delay((1000..3000).random().toLong()) // Προσομοίωση καθυστέρησης δικτύου
City(city, (15..30).random())
}
fun main() = runBlocking {
val cities = listOf("Κωνσταντινούπολη", "Άγκυρα", "Σμύρνη", "Προύσα")
val jobs = cities.map { city ->
async { getTemperature(city) } // Παράλληλη έναρξη
}
val results = jobs.awaitAll() // Περιμένει όλα
results.forEach { println("${it.name}: ${it.temperature}°C") }
// Σειριακά θα ήταν 10+ δευτερόλεπτα, παράλληλα ~3 δευτερόλεπτα!
}Ενσωμάτωση Android/Compose (σύντομο παράδειγμα):
Προχωρημένα Θέματα και Συμβουλές
- Timeout:withTimeout(5000) ... ή withTimeoutOrNull.
- Channel: Επικοινωνία μεταξύ coroutines (producer-consumer).
- Δοκιμές:runTest για δοκιμές coroutines.
- Ktor client: Ενσωματωμένη υποστήριξη coroutines για ασύγχρονο HTTP.
- Απόδοση:Dispatchers.IO.limitedParallelism(64) για προσαρμοσμένο pool.
Συμπέρασμα και Πρακτικές Συμβουλές
Τα coroutines είναι η υπερδύναμη του Kotlin στον ασύγχρονο κόσμο – απαλλαγείτε από callback hell, γράψτε καθαρό και γρήγορο κώδικα. Για πρακτική:
- Γράψτε απλό client "Todo API": Retrofit + Coroutines με παράλληλες κλήσεις.
- Δημιουργήστε εφαρμογή καιρού με loading spinner στο Android (Compose + ViewModelScope).
- Δημιουργήστε κοινό επίπεδο δικτύωσης σε multiplatform έργο (Ktor client).
- Πόροι: Kotlin docs (coroutines), "Kotlin Coroutines by Tutorials" (raywenderlich), επίσημα παραδείγματα GitHub.
Με αυτόν τον οδηγό, θα έχετε κατανοήσει πλήρως τα coroutines. Σε πραγματικά έργα (κλήσεις δικτύου, εργασίες φόντου) τα coroutines θα σας δώσουν μεγάλη απόδοση και αναγνωσιμότητα. Για λεπτομέρειες παραδείγματος έργου ή συγκεκριμένο τμήμα, αφήστε σχόλιο! Καλή επιτυχία στις εφαρμογές που θα αναπτύξετε με Kotlin το 2026.

