Middle
Ποια μηχανισμούς παρέχει το Kotlin για εργασία με παράλληλους υπολογισμούς;
sobes.tech AI
Απάντηση από AI
- Coroutines (Coroutines): Ελαφριά νήματα που επιτρέπουν την γραφή ασύγχρονου κώδικα με επιτακτικό στυλ, αποφεύγοντας τις μπλοκαριστικές κλήσεις. Βασίζονται σε επανεκκινούμενες λειτουργίες και δεν συνδέονται με εγγενή νήματα.
- Dispatchers: Ορίζουν το νήμα ή το σύνολο νημάτων όπου θα εκτελεστεί η coroutine.
Dispatchers.Default: Για εργασίες που καταναλώνουν πόρους (π.χ. CPU-bound).Dispatchers.IO: Για λειτουργίες εισόδου/εξόδου (π.χ. αιτήματα δικτύου, εργασία με αρχεία).Dispatchers.Main: Για την εκτέλεση κώδικα στο κύριο νήμα (π.χ. ενημέρωση UI σε μια εφαρμογή Android).Dispatchers.Unconfined: Εκτελεί την coroutine στο τρέχον νήμα μέχρι την πρώτη κλήση σε μια suspend λειτουργία.
- Suspend-λειτουργίες: Λειτουργίες που μπορούν να διακοπούν και να συνεχιστούν αργότερα. Σημειώνονται με τον τροποποιητή
suspend. - Context: Περιέχει πληροφορίες σχετικά με την coroutine, όπως ο dispatcher, το job και ο χειριστής εξαιρέσεων.
- Job: Αντιπροσωπεύει τον κύκλο ζωής της coroutine (εκτελείται, ενεργή, ολοκληρώθηκε, ακυρώθηκε). Επιτρέπει τον έλεγχο της coroutine (ακύρωση, αναμονή για ολοκλήρωση).
- Scope: Ορίζει το πεδίο εφαρμογής για τις coroutine, διαχειρίζοντας τον κύκλο ζωής τους.
- MutableStateFlow / SharedFlow: Στη βιβλιοθήκη
kotlinx.coroutines.flow, επιτρέπουν ασφαλή ανταλλαγή δεδομένων μεταξύ coroutine. - Mutex: Primitive συγχρονισμού για την προστασία κρίσιμων τμημάτων.
import kotlinx.coroutines.*
fun main() = runBlocking {
// Παράδειγμα χρήσης coroutine και dispatcher
val job = launch(Dispatchers.Default) {
repeat(5) { i ->
println("Εργασιακή coroutine: $i")
delay(100) // Μη μπλοκαριστική καθυστέρηση
}
}
println("Ξεκίνησε η coroutine")
job.join() // Περιμένει την ολοκλήρωση της coroutine
println("Ολοκληρώθηκε η coroutine")
}
// Παράδειγμα suspend-λειτουργίας
suspend fun fetchData(): String {
delay(1000) // Εικονικό αίτημα δικτύου
return "Δεδομένα λήφθηκαν"
}
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
val mutex = Mutex()
var counter = 0
suspend fun incrementCounter() {
mutex.withLock {
counter++
}
}