Sobes.tech
Middle

Ποια στοιχεία πολυνηματικής παρέχει το Kotlin;

sobes.tech AI

Απάντηση από AI

Το Kotlin παρέχει τα ακόλουθα στοιχεία πολυνηματισμού:

  • Coroutines: Ελαφριά νήματα βασισμένα σε λειτουργίες που μπορούν να ανασταλούν. Παρέχουν ασύγχρονη και μη μπλοκαρισμένη εκτέλεση κώδικα.
  • Κατασκευαστές coroutine: Συναρτήσεις που ξεκινούν coroutines. Βασικές: launch (ξεκινά μια coroutine χωρίς να επιστρέφει τιμή), async (ξεκινά μια coroutine και επιστρέφει ένα Deferred, το οποίο μπορεί να περιμένει κανείς για να λάβει το αποτέλεσμα).
    // Παράδειγμα χρήσης launch
    GlobalScope.launch {
        println("Γειά από coroutine ${Thread.currentThread().name}")
    }
    
    // Παράδειγμα χρήσης async
    val deferred = GlobalScope.async {
        delay(1000) // Μιμούμαστε μια μακρά λειτουργία
        "Αποτέλεσμα"
    }
    val result = runBlocking { deferred.await() } // Περιμένουμε το αποτέλεσμα
    
  • Dispatchers: Καθορίζουν σε ποιον πυρήνα θα εκτελεστεί η coroutine. Βασικά:
    • Dispatchers.Default: Κοινό pool νημάτων για εργασίες που απαιτούν CPU.
    • Dispatchers.IO: Pool νημάτων για μπλοκαριστικές λειτουργίες εισόδου/εξόδου.
    • Dispatchers.Main: Διαχειριστής για το νήμα διεπαφής χρήστη σε κατάλληλες πλατφόρμες (Android, Swing).
    • Dispatchers.Unconfined: Η coroutine ξεκινά στο τρέχον νήμα, αλλά μπορεί να συνεχίσει σε οποιοδήποτε νήμα.
    GlobalScope.launch(Dispatchers.IO) {
        // Εκτέλεση εισόδου/εξόδου
    }
    
  • runBlocking: Συνάρτηση κατασκευαστής coroutine που μπλοκάρει το τρέχον νήμα μέχρι να ολοκληρωθεί η coroutine. Χρησιμοποιείται για συνδυασμό μπλοκαρισμένου και μη μπλοκαρισμένου κώδικα, συχνά σε τεστ ή κύριες συναρτήσεις.
    runBlocking {
        launch {
            delay(500)
            println("Ολοκληρώθηκε στο ${Thread.currentThread().name}")
        }
        println("Ξεκίνησε στο ${Thread.currentThread().name}")
    }
    
  • suspend συναρτήσεις: Συναρτήσεις των οποίων η εκτέλεση μπορεί να ανασταλεί και να συνεχιστεί. Μπορούν να κληθούν μόνο από άλλες suspend συναρτήσεις ή κατασκευαστές coroutine.
    suspend fun doSomething() {
        delay(100) // Παράδειγμα αναστολής
    }
    
  • Job: Χειριστής σε μια ξεκινήμένη coroutine. Παρέχει μεθόδους για διαχείριση του κύκλου ζωής της coroutine (ακύρωση, αναμονή για ολοκλήρωση).
    val job = GlobalScope.launch {
       // Μακρά λειτουργία
    }
    job.cancel() // Ακύρωση coroutine
    runBlocking { job.join() } // Αναμονή για ολοκλήρωση
    
  • CoroutineScope: Ορίζει το πεδίο ορατότητας για τις coroutine. Οι coroutine που ξεκινούν σε αυτό το πεδίο ακυρώνονται αυτόματα όταν ακυρώνεται το πεδίο. Βοηθά στη διαχείριση του κύκλου ζωής των coroutine.
    val scope = CoroutineScope(Dispatchers.Default)
    scope.launch {
        // Coroutine σε αυτό το πεδίο
    }
    scope.cancel() // Ακύρωση όλων των coroutine σε αυτό το πεδίο
    
  • Channels (Channel): Πρωτόκολλα για ασφαλή μεταφορά δεδομένων μεταξύ coroutine. Τα κανάλια μπορούν να είναι μονόδρομα (μόνο για αποστολή ή λήψη) ή διπλής κατεύθυνσης.
    import kotlinx.coroutines.channels.Channel
    
    val channel = Channel<Int>()
    
    runBlocking {
        launch {
            for (x in 1..5) channel.send(x * x)
            channel.close() // Σημαντικό να κλείσει το κανάλι
        }
        launch {
            for (y in channel) println(y)
        }
    }
    
  • Μουτέξ (Mutex): Πρωτόκολλα συγχρονισμού για την εξασφάλιση αποκλειστικής πρόσβασης σε κοινό πόρο. Παρέχουν ασφάλεια νημάτων, επιτρέποντας σε μόνο μια coroutine να κατέχει το mutex σε μια δεδομένη στιγμή.
    import kotlinx.coroutines.sync.Mutex
    import kotlinx.coroutines.sync.withLock
    
    val mutex = Mutex()
    var counter = 0
    
    suspend fun incrementCounter() {
        mutex.withLock {
            counter++
        }
    }
    
  • Καταστάσεις (StateFlow, SharedFlow): Πρωτόκολλα για εργασία με ροές δεδομένων στο πλαίσιο της αντιδραστικής προγραμματισμού και πολυνηματισμού. Το StateFlow αντιπροσωπεύει μια "κρύα" ροή με τρέχουσα κατάσταση, ενώ το SharedFlow μια "καυτή" ροή για ευρεία διανομή δεδομένων.