java:concurrency_intro

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Next revision Both sides next revision
java:concurrency_intro [2015/03/24 13:24]
gthanos [Επανενεργοποίηση ενός νήματος μέσω της μεθόδου interrupt()]
java:concurrency_intro [2015/03/24 13:47]
gthanos [Επανενεργοποίηση ενός νήματος μέσω της μεθόδου interrupt()]
Line 86: Line 86:
   }   }
 </​code>​ </​code>​
 +
 +Εάν ένα νήμα δεν καλεί κάποια μέθοδο που δημιουργεί [[http://​docs.oracle.com/​javase/​7/​docs/​api/​java/​lang/​InterruptedException.html|InterruptedException]] θα πρέπει περιοδικά να ελέγχει κατά πόσο υπάρχει κάποια σήμα διακοπής προς το συγκεκριμένο νήμα σε μία ανακύκλωση της μορφής
 +
 +<code java>
 +for (int i = 0; i < inputs.length;​ i++) {
 +    heavyCalc(inputs[i]);​
 +    if (Thread.interrupted()) {
 +        throw new InterruptedException();​
 +    }
 +}
 +</​code>​
 +
 +<WRAP center round 85% tip>
 +Ο μηχανισμός διακοπής υλοποιείται χρησιμοποιώντας ένα εσωτερικό flag (boolean true/false) γνωστό ως interrupt status. H κλήση της Thread.interrupt() θέτει στην τιμή true αυτό το flag. Κάθε φορά που ένα νήμα ελέγχει αν έχει διακοπεί ή όχι (καλώντας τη στατική μέθοδο Thread.interrupted() ), το παραπάνω flag απενεργοποιείται λαμβάνοντας την τιμή false. ​
 +
 +Η μη στατική μέθοδος isInterrupted(),​ χρησιμοποιείται από ένα νήμα για να ενημερωθεί για την κατάσταση διακοπής του ιδίου νήματος ή ενός άλλου νήματος (εξαρτάται από το αντικείμενο που την καλεί),​ αλλά δεν αλλάζει την κατάσταση του flag διακοπής.
 +</​WRAP>​
 +
 +===== Περιμένοντας ένα νήμα να ολοκληρώσει μέσω της μεθόδου join() =====
 +
 +Η μέθοδος [[http://​docs.oracle.com/​javase/​7/​docs/​api/​java/​lang/​Thread.html#​join()|join()]] επιτρέπει σε ένα νήμα να σταματήσει την εκτέλεση του έως ότου ένα άλλο νήμα να ολοκληρώσει την εκτέλεση του. Αν υποθέσουμε ότι ένα νήμα '​t'​ εκτελείται παράλληλα με το τρέχον νήμα, εάν το τρέχον νήμα καλέσει το παρακάτω
 +
 +<code java>
 +  t.join();
 +</​code>​
 +
 +τότε η εκτέλεση του σταματάει έως ότου το νήμα '​t'​ να τερματίσει την εκτέλεση του. Υπάρχουν οι εξής παραλλαγές της μεθόδου join
 +  * **t.join():​** περίμενε μέχρι το νήμα t να τερματίσει
 +  * **t.join(long millis):** μέχρι το νήμα t να τερματίσει ή περίμενε για **millis** milliseconds.
 +  * **t.join(long millis, int nanos):** μέχρι το νήμα t να τερματίσει ή περίμενε για **millis+nanos/​1000000** milliseconds.
  
  
java/concurrency_intro.txt · Last modified: 2016/02/26 11:15 (external edit)