Sobes.tech
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++
    }
}