This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
java:concurrency_intro [2015/03/24 13:19] gthanos [Σταματώντας την εκτέλεση ενός νήματος μέσω της μεθόδου sleep()] |
java:concurrency_intro [2015/03/24 13:35] gthanos [Επανενεργοποίηση ενός νήματος μέσω της μεθόδου interrupt()] |
||
---|---|---|---|
Line 76: | Line 76: | ||
===== Επανενεργοποίηση ενός νήματος μέσω της μεθόδου interrupt() ===== | ===== Επανενεργοποίηση ενός νήματος μέσω της μεθόδου interrupt() ===== | ||
- | Μία διακοπή (interrupt) αποτελεί ένδειξη προς την διεργασία να σταματήσει να κάνει αυτό που κάνει και να εκκινήσει κάτι διαφορετικό ή να τερματίσει. Εάν ένα νήμα έχει καλέσει την sleep(). | + | Μία διακοπή (interrupt) αποτελεί ένδειξη προς την διεργασία να σταματήσει να κάνει αυτό που κάνει και να εκκινήσει κάτι διαφορετικό ή να τερματίσει. Η java υποστηρίζει την μέθοδο [[http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#interrupt()|Thread.interrupt()]] για την αποστολή ενός σήματος διακοπής σε ένα νήμα. Εάν ένα νήμα έχει καλέσει την sleep() η κλήση της interrupt() για το νήμα αυτό, θα το αφυπνίσει και θα παραχθεί ένα [[http://docs.oracle.com/javase/7/docs/api/java/lang/InterruptedException.html|InterruptedException]] για το νήμα που κοιμόταν. Για τον λόγο αυτό, η κλήση της sleep() θα πρέπει να γίνεται πάντα μέσα σε ένα try/catch block της μορφής |
+ | |||
+ | <code java> | ||
+ | try { | ||
+ | Thread.sleep(4000); | ||
+ | } catch (InterruptedException e) { | ||
+ | System.out.println(("We've been interrupted: no more messages."); | ||
+ | return; | ||
+ | } | ||
+ | </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 (σημαία) γνωστό ως interrupt status. H κλήση της Thread.interrupt() θέτει στην τιμή true αυτήν τη σημαία. Όταν ένα νήμα ελέγχει αν έχει διακοπεί ή όχι καλώντας τη στατική μέθοδο Thread.interrupted(), το παραπάνω flag απενεργοποιείται. Η μη στατική μέθοδος isInterrupted(), χρησιμοποιείται από ένα νήμα για να ενημερωθεί για την κατάσταση διακοπής του ιδίου νήματος ή ενός άλλου νήματος (εξαρτάται από το αντικείμενο που την καλεί), αλλά δεν αλλάζει την κατάσταση του flag διακοπής. | ||
+ | </WRAP> | ||
+ | |||
+ | |||