Νήµαταστην Java Συγχρονισµός νηµάτων Επικοινωνία νηµάτων Εκτελέσιµα αντικείµενα Νήµατα δαίµονες Οµάδες νηµάτων Κατανεµηµένα Συστήµατα 11-1
Νήµαταστην Java γεννηθείσα notify notifyall έτοιµη start εκπνοή κβάντου χρόνου yield διακοπή διανοµή ολοκλήρωση εισόδου/εξόδου wait sleep εκτελούµενη ολοκλήρωση εκτέλεσης αίτηση για είσοδο/έξοδο σε αναµονή κοιµώµενη νεκρή εµποδισµένη εκπνοή διαστήµατος ύπνου Καταστάσεις νηµάτων Παρόµοιες µε αυτές των διεργασιών Κατανεµηµένα Συστήµατα 11-2
Νήµαταστην Java ιάφοροι τρόποι διακοπής εκτέλεσης Αναµονή εισόδου / εξόδου Αναµονή χρονοµέτρου (sleep) Αναµονή γεγονότος (wait) Κάθε εφαρµογή ξεκινά µε ένα νήµα Εκτελεί τη µέθοδο main της εφαρµογής Το νήµα αυτό µπορεί να δηµιουργήσει άλλα Προτεραιότητες νηµάτων Κάθε νήµα έχει προτεραιότητα 1 (χαµηλή) έως 10 (υψηλή) Η προτεραιότητα κληρονοµείται από τον γονέα Χρονοπρογραµµατισµός ανάλογα µε την προτεραιότητα ιακοπτόµενος ή µη διακοπτόµενος χρονοπρογραµµατισµός Εξαρτάται από την πλατφόρµα της Java Κατανεµηµένα Συστήµατα 11-3
Νήµαταστην Java Νήµατα: Τάξη Thread Thread (String όνοµα_νήµατος) Κατασκευάζει ένα νήµα µε συγκεκριµένο όνοµα Thread () Κατασκευάζει ένα νήµα µε όνοµα "Thread-#" void start() Ξεκινά την εκτέλεση ενός νέου νήµατος (µέθοδος run()) Τα δύο νήµατα εκτελούνται παράλληλα void run () Η µέθοδος που περιέχει τον κώδικα του νήµατος Κάθε υποτάξη της Thread ορίζει τη δική της run() void setname (String όνοµα) / String getname () Θέτει/επιστρέφει το όνοµα του νήµατος Κατανεµηµένα Συστήµατα 11-4
Νήµαταστην Java static Thread currentthread () Επιστρέφει µία αναφορά προς το εκτελούµενο νήµα void sleep (int διάστηµα) Αποκοιµίζει το νήµα για διάστηµα msec void yield () Παραχωρεί τον επεξεργαστή σε άλλα νήµατα void interrupt () Στέλνει στο νήµα ένα σήµα διακοπής σ ένα νήµα Αν το νήµα είναι σε κοιµισµένο ή σε αναµονή ξυπνάει Αλλιώς το νήµα πρέπει να ελέγχει ρητά αν έχει λάβει διακοπές boolean isinterrupted () Επιστρέφει true αν το νήµα έχει διακοπεί Κατανεµηµένα Συστήµατα 11-5
Νήµαταστην Java boolean isalive () Επιστρέφει true το νήµα εκτελείται void setpriority (int προτεραιότητα) / int getpriority () Θέτει/επιστρέφει την προτεραιότητα του νήµατος void join (long διάστηµα) Περιµένει τον τερµατισµό του νήµατος για διάστηµα msec Αν το διάστηµα είναι 0, αναµονή για πάντα void join (): Ισοδύναµη µε join(0) void checkaccess () Εξετάζει αν έχουµε πρόσβαση στο νήµα Εξαίρεση αν δεν έχουµε, επιστροφή αν έχουµε boolean holdslock (Object Obj) Επιστρέφει true αν το νήµα κατέχει την κλειδαριά του Obj Κατανεµηµένα Συστήµατα 11-6
Νήµαταστην Java ThreadGroup getthreadgroup () Επιστρέφει την οµάδα του νήµατος int activecount () Επιστρέφει το πλήθος ενεργών νηµάτων της οµάδας int enumerate (Thread[] πίνακας) Αντιγράφει κάθε ενεργό νήµα της οµάδας στον πίνακα Αν ο πίνακας είναι µικρός, δεν αποθηκεύονται όλα String tostring () Επιστρέφει όνοµα, προτεραιότητα και οµάδα του νήµατος void dumpstack () Εµφανίζει τη στοίβα κλήσεων των µεθόδων του νήµατος Χρήσιµη για εκσφαλµάτωση εφαρµογών Κατανεµηµένα Συστήµατα 11-7
Συγχρονισµόςνηµάτων Κάθε αντικείµενο έχει µια κλειδαριά (lock) Μία κλειδαριά ανά υπόσταση (αντικείµενο) Η κλειδαριά µπορεί να δεσµεύεται από ένα νήµα Απόκτηση της κλειδαριάς πριν από κρίσιµη περιοχή Απελευθέρωση της κλειδαριάς µετά από κρίσιµη περιοχή Χρήση synchronized µεθόδων και εντολών Παρακολουθητής (monitor)αντικειµένου Ελέγχει την κλειδαριά του αντικειµένου Επιτρέπει σε ένα µόνο νήµα την απόκτηση της κλειδαριάς Εµποδίζει όλα τα άλλα νήµατα Απόκτηση κλειδαριάς για εκτέλεση synchronized µεθόδου Επιτρέπονται πολλές synchronized µέθοδοι ανά αντικείµενο Αµοιβαίος αποκλεισµός όλων των synchronized µεθόδων Κατανεµηµένα Συστήµατα 11-8
Συγχρονισµόςνηµάτων Προστασία δεδοµένων αντικειµένου Τα δηµόσια (public) δεδοµένα δεν προστατεύονται Ιδιοκτησία κλειδαριάς αντικειµένου Η κλειδαριά καλύπτει όλες τις µεθόδους του αντικειµένου Το νήµα που την απέκτησε µπορεί να κάνει πολλές κλήσεις Κληρονοµικότητα τάξεων Ακύρωση synchronized µε µη synchronized µεθόδους Ακύρωση µη synchronized µε synchronized µεθόδους Στατικές µέθοδοι synchronized Το αντικείµενο τάξης έχει ανεξάρτητη κλειδαριά Ανεξάρτητη από τις κλειδαριές των υποστάσεων Οι στατικές µέθοδοι συγχρονίζονται µεταξύ τους Κατανεµηµένα Συστήµατα 11-9
Συγχρονισµόςνηµάτων Synchronizedεντολές Synchronized (παράσταση) { εντολές } Αρχικά υπολογίζεται η παράσταση Πρέπει να καταλήγει σε αναφορά αντικειµένου Αποκτάται η κλειδαριά του αντικειµένου Οι εντολές εκτελούνται µε αµοιβαίο αποκλεισµό Γιατί synchronizedεντολές; Μικρότερες κρίσιµες περιοχές Συγχρονισµός πάνω σε οποιοδήποτε αντικείµενο Συγχρονισµός πάνω σε κλειδαριά αντικειµένου τάξης Γιατί synchronized µέθοδοι; Συγχρονισµός από την πλευρά του εξυπηρετητή Το αντικείµενο αποφασίζει για το συγχρονισµό του Κατανεµηµένα Συστήµατα 11-10
Επικοινωνίανηµάτων Συγχρονισµός µε βάση συνθήκες Παράδειγµα: πρόβληµα παραγωγού-καταναλωτή Ο παραγωγός περιµένει για κενές θέσεις ενταµιευτών Ο καταναλωτής περιµένει για γεµάτες θέσεις ενταµιευτών Αναµονή µέχρι να ισχύσει κάποια συνθήκη void wait (long timeout): εµποδισµός νήµατος Το νήµα εµποδίζεται µέχρι: 1. Να κληθεί η µέθοδος notify και να επιλεγεί το νήµα 2. Να κληθεί η µέθοδος notifyall 3. Να περάσουν timeout msec 4. Να κληθεί η interrupt για την αποστολή διακοπής στο νήµα void wait (): ισοδύναµη µε wait (0) Αναµονή χωρίς εκπνοή χρονικού διαστηµατος Κατανεµηµένα Συστήµατα 11-11
Επικοινωνίανηµάτων void notifyall (): απελευθέρωση όλων των νηµάτων Μπορεί να άλλαξε κάποια συνθήκη αναµονής Ένα µόνο νήµα αποκτά την κλειδαριά Τα υπόλοιπα εµποδίζονται πάνω στην κλειδαριά void notify(): απελευθέρωση ενός νήµατος Μπορεί να άλλαξε κάποια συνθήκη αναµονής εν µπορούµε να επιλέξουµε το νήµα που απελευθερώνεται Χρήσιµη όταν δεν µας ενδιαφέρει το συγκεκριµένο νήµα Χρήσιµη όταν έχουµε µία µόνο συνθήκη αναµονής Σχέση wait και notify/notifyall Οι γνωστοποιήσεις δεν αποθηκεύονται Κάθε wait πρέπει να ακολουθείται από ένα notify / notifyall Χρήση timeout για αποφυγή αδιεξόδων Κατανεµηµένα Συστήµατα 11-12
Επικοινωνίανηµάτων Χρήση wait και notify/notifyall Επικοινωνία µόνο µέσω synchronized µεθόδων εν µπορούν να κληθούν από άλλες µεθόδους Σηµασιολογία εντολής wait Εµποδισµός του νήµατος πάνω στο αντικείµενο Απελευθέρωση κλειδαριάς αντικειµένου Η απελευθέρωση θα γίνει µέσω notify / notifyall Όταν εκτελεστεί ξανά το νήµα θα κατέχει την κλειδαριά Χρήση εντολής wait Κλήση wait πάντα µέσα σε βρόχο while (όχι εντολή if) Ο βρόχος ελέγχει την επιθυµητή συνθήκη Αν δεν ισχύει το νήµα εµποδίζεται Όταν το νήµα εκτελεστεί δεν θα ισχύει απαραίτητα η συνθήκη Κατανεµηµένα Συστήµατα 11-13
Επικοινωνίανηµάτων Σηµασιολογία εντολής notifyall Καλείται όταν ικανοποιηθεί κάποια συνθήκη Απελευθέρωση όλων των νηµάτων που κάλεσαν τη wait Κάθε νήµα αποκτά την κλειδαριά µε τη σειρά Τα νήµατα ελέγχουν τη συνθήκη αναµονής Αν δεν ικανοποιείται, εµποδίζονται ξανά Σηµασιολογία εντολής notify Απελευθερώνει ένα µόνο νήµα Κίνδυνος απελευθέρωσης λάθους νήµατος Πότε αξίζει η notify; Πιο οικονοµική από notifyall (ξυπνά ένα νήµα) Όλα τα νήµατα πρέπει να περιµένουν στην ίδια συνθήκη Mόνο ένα πρέπει να επωφελείται από τη συνθήκη Κατανεµηµένα Συστήµατα 11-14
Εκτελέσιµααντικείµενα ηµιουργία νηµάτων Απλούστερη µέθοδος η επέκταση της τάξης Thread εν γίνεται αν το αντικείµενο επεκτείνει κάποια άλλη τάξη Η Java δεν υποστηρίζει πολλαπλή κληρονοµικότητα τάξεων ιεπαφή Runnable Υλοποίηση από εκτελέσιµα αντικείµενα (νήµατα) Το αντικείµενο µπορεί να επεκτείνει οποιαδήποτε τάξη Περιέχει µόνο την (αφηρηµένη) µέθοδο run() Περνάµε το νήµα σε κατασκευαστή της τάξης Thread Εκκίνηση του νήµατος µε τη µέθοδο start() Thread (Runnable αντικείµενο, Stringόνοµα_νήµατος) ηµιουργεί επώνυµο νήµα για το αντικείµενο Runnable Thread (Runnable αντικείµενο) ηµιουργεί το νήµα "Thread-# " για το αντικείµενο Runnable Κατανεµηµένα Συστήµατα 11-15
Νήµαταδαίµονες Νήµατα χρήστη και νήµατα δαίµονες Κάθε νήµα είναι είτε νήµα χρήστη είτε νήµα δαίµων Η µέθοδος main εκτελείται από νήµα χρήστη Τα νήµατα δαίµονες εκτελούνται στο παρασκήνιο Η εφαρµογή δηµιουργεί όποια νήµατα θέλει Η εφαρµογή τερµατίζεται όταν τελειώσουν τα νήµατα χρήστη Τα νήµατα δαίµονες θανατώνονται αυτόµατα Ορισµός τύπου νήµατος Τα νέα νήµατα κληρονοµούν τον τύπο του δηµιουργού τους void setdaemon (booleanείναι_δαίµων) Σηµειώνει ένα νήµα ως νήµα δαίµονα ή χρήστη Επιτρέπεται η κλήση της µόνο από το δηµιουργό του boolean isdaemon () Επιστρέφει true αν το νήµα είναι δαίµων Κατανεµηµένα Συστήµατα 11-16
Οµάδεςνηµάτων Οµάδες νηµάτων: Τάξη ThreadGroup Ενιαία διαχείριση και προστασία νηµάτων οµάδας Κοινές µέθοδοι Thread και ThreadGroup Ιεραρχική οργάνωση οµάδων νηµάτων Ρίζα η οµάδα main που δηµιουργείται αυτόµατα Ένταξη νηµάτων σε οµάδες Κάθε νήµα προστίθεται στην οµάδα του δηµιουργού του Ο δηµιουργός µπορεί να ορίσει άλλη οµάδα Ο διαχειριστής ασφαλείας µπορεί να ορίσει άλλη οµάδα Οµάδες νηµάτων δαίµονες Καταστρέφονται όταν δεν περιέχουν ενεργά νήµατα ε σχετίζονται µε νήµατα δαίµονες Μπορεί να περιέχουν νήµατα δαίµονες ή χρήστη Κατανεµηµένα Συστήµατα 11-17
Οµάδεςνηµάτων ThreadGroup (String οµάδα) ηµιουργεί µία οµάδα νηµάτων µε γονέα την τρέχουσα οµάδα ThreadGroup (ThreadGroup γονέας, Stringοµάδα) Η οµάδα γονέας ορίζεται ρητά Σχετικοί κατασκευαστές νηµάτων Thread (ThreadGroup οµάδα, String όνοµα) ηµιουργεί ένα νήµα και το εντάσσει σε οµάδα Thread (ThreadGroup οµάδα, Runnable αντικείµενο) Χρησιµοποιεί επιπλέον ένα αντικείµενο Runnable Thread (ThreadGroup οµάδα, Runnableαντικείµενο, Stringόνοµα) Ορίζει επιπλέον και το όνοµα του νήµατος Κατανεµηµένα Συστήµατα 11-18
Οµάδεςνηµάτων String getname () επιστρέφει το όνοµα αυτής της οµάδας νηµάτων ThreadGroup getparent () Επιστρέφει την πατρική οµάδα νηµάτων void setdaemon(boolean δαίµονας) / boolean isdaemon() Θέτει / επιστρέφει τον τύπο της οµάδας void setmaxpriority (intµέγιστη) / int getmaxpriority () Θέτει / επιστρέφει τη µέγιστη προτεραιότητα νηµάτων εν αλλάζει την προτεραιότητα των ενεργών νηµάτων boolean parentof (ThreadGroup g) Επιστρέφει true αν η οµάδα είναι γονέας της g int activecount () Επιστρέφει πλήθος ενεργών νηµάτων οµάδας και υποοµάδων Κατανεµηµένα Συστήµατα 11-19
Οµάδεςνηµάτων int activegroupcount () Επιστρέφει πλήθος ενεργών υποοµάδων της οµάδας int enumerate (Thread[] πίνακας, booleanαναδρ) Αντιγράφει κάθε ενεργό νήµα αυτής της οµάδας σε πίνακα Αν αναδρ == true περιλαµβάνει τις οµάδες παιδιά int enumerate (Thread[] πίνακας) Είναι ισοδύναµη µε int enumerate (Thread[] πίνακας, true) int enumerate (ThreadGroup[] πίνακας, booleanαναδρ) Αντιγράφει τις ενεργές οµάδες της οµάδας αυτής σε πίνακα int enumerate (ThreadGroup[] πίνακας) Είναι ισοδύναµη µε int enumerate (ThreadGroup[] πίνακας, true) Κατανεµηµένα Συστήµατα 11-20
Οµάδεςνηµάτων void checkaccess() Επιστρέφει true αν το τρέχον νήµα έχει πρόσβαση στην οµάδα void interrupt() ιακόπτει όλα τα νήµατα της οµάδας και των υποοµάδων της void destroy() Καταστρέφει την οµάδα και όλες τις υποοµάδες της Η οµάδα πρέπει να είναι κενή! uncaughtexception (Thread νήµα, Throwableεξαίρεση) Καλείται όταν ένα νήµα πεθάνει λόγω ασύλληπτης εξαίρεσης public String tostring () Επιστρέφει συµβολοσειρά µε όνοµα και προτεραιότητα οµάδας public void list() Εµφανίζει την τιµή που επιστρέφει η tostring() για κάθε νήµα Κατανεµηµένα Συστήµατα 11-21