Καρακασίδης Αλέξανδρος Καστίδου Γεωργία Παπαφώτη Μαρία Πέτσιος Κων/νος Στέφανος Σαλτέας Καλογεράς Παναγιώτης. Threads in Java ΝΗΜΑΤΑ ΣΤΗ JAVA



Σχετικά έγγραφα
Ορισµός Νήµα (thread) είναι µια ακολουθιακή ροή ελέγχου (δηλ. κάτι που έχει αρχή, ακολουθία εντολών και τέλος) σ ένα

Νήµαταστην Java. Συγχρονισµός νηµάτων Επικοινωνία νηµάτων Εκτελέσιµα αντικείµενα Νήµατα δαίµονες Οµάδες νηµάτων. Κατανεµηµένα Συστήµατα 11-1

Οντοκεντρικός Προγραμματισμός

Κατανεμημένα Συστήματα: Θεωρία και Προγραμματισμός. Ενότητα # 8: Ταυτοχρονισμός και νήματα Διδάσκων: Γεώργιος Ξυλωμένος Τμήμα: Πληροφορικής

Αντικειμενοστρεφής Προγραμματισμός

Ε-85: Ειδικά Θέµατα Λογισµικού

Το παρακάτω πρόγραμμα ορίζει δυο κλάσεις την SimpleThread και την TwoThreadsTest:

Κατανεμημένα Συστήματα

Νήµατα. ιεργασίες και νήµατα Υλοποίηση νηµάτων Ελαφριές διεργασίες Αξιοποίηση νηµάτων. Κατανεµηµένα Συστήµατα 10-1

Τ.Ε.Ι. Μεσολογγίου, Τµήµα τηλεπικοινωνιακών Συστημάτων & Δικτύων

Κινητά και Διάχυτα Συστήματα. Ενότητα # 3: Νήματα και ταυτοχρονισμός Διδάσκων: Γεώργιος Ξυλωμένος Τμήμα: Πληροφορικής

Ειδικά Θέματα Προγραμματισμού

Διάλεξη Εισαγωγή στη Java, Μέρος Γ

Κλάσεις και Αντικείµενα

Εισαγωγή στην Java. Module 9: Threads. Prepared by Chris Panayiotou for EPL /03/2004

Αντικειµενοστρεφής Προγραµµατισµός

Εισαγωγή εκτελέσιμου κώδικα σε διεργασίες

2.1 Αντικειµενοστρεφής προγραµµατισµός

ηµιουργία ιαλογικών Προγραµµάτων για το Web

Remote Method Invocation (RMI)

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ

Διεργασίες (μοντέλο μνήμης & εκτέλεσης) Προγραμματισμός II 1

ιεργασίες και νήµατα Προγραµµατισµός ΙΙΙ 1 lalis@inf.uth.gr

Κλάσεις στη Java. Παύλος Εφραιμίδης. Java Κλάσεις στη Java 1

Κλάσεις στη Java. Στοίβα - Stack. Δήλωση της κλάσης. ΗκλάσηVector της Java. Ηκλάση Stack

Προγραμματισμός ΙΙ (Java) 10. Πολυνηματικές εφαρμογές

13. Νήματα Νήματα και χρήση νημάτων στη Java Τι είναι τα νήματα; Τρία μέρη ενός νήματος

Κεφάλαιο 1. Νήματα (Threads). Time Sharing

Ιδιοκτησία Αντικειµένου

Λειτουργικά συστήματα πραγματικού χρόνου

Συγχρονισµός: Αδιέξοδο & Παρατεταµένη Στέρηση

Λογισµικό (Software SW) Γλώσσες

ΤρόποςΑξιολόγησης: α) Εργαστήρια (Προαιρετικάµε 20% - 35% βαρύτητα µόνοθετικά) β) Τελική Γραπτή Εξέταση

Παράλληλη Επεξεργασία

Περιεχόµενα. 1 Εισαγωγή στις οµές εδοµένων 3. 2 Στοίβα (Stack) 5

3 Αλληλεπίδραση Αντικειμένων

Διεργασίες (μοντέλο μνήμης & εκτέλεσης) Προγραμματισμός II 1

Λειτουργικά Συστήματα (Λ/Σ)

Κεφάλαιο 3. Διδακτικοί Στόχοι

Πρόγραµµα 9.1 Πέρασµα δεδοµένων στην µνήµη

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκή περίοδος

ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ

«ΕΙΔΙΚΑ ΘΕΜΑΣΑ ΣΟΝ ΠΡΟΓΡΑΜΜΑΣΙΜΟ ΤΠΟΛΟΓΙΣΩΝ» Κεφάλαιο 4: Αντικειμενοςτρεφήσ Προγραμματιςμόσ

Εργαστήριο ΔΙΕΡΓΑΣΙΕΣ - ΔΙΑΧΕΙΡΙΣΗ

Το πρόγραμμα HelloWorld.java. HelloWorld. Κλάσεις και Αντικείμενα (2) Ορισμός μιας Κλάσης (1) Παύλος Εφραιμίδης pefraimi <at> ee.duth.

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 11/3/2008

Δομημένος Προγραμματισμός

Γενικά (για τις γραπτές εξετάσεις)

Λειτουργικά Συστήματα (διαχείριση επεξεργαστή, μνήμης και Ε/Ε)

Τι είναι ένα λειτουργικό σύστημα (ΛΣ); Μια άλλη απεικόνιση. Το Λειτουργικό Σύστημα ως μέρος του υπολογιστή

Η Υλοποίηση της Επικοινωνίας. Κατανεµηµένα Συστήµατα

Εισαγωγικά & Βασικές Έννοιες

Εισαγωγικά & Βασικές Έννοιες

Dr. Garmpis Aristogiannis - EPDO TEI Messolonghi

Μάθημα 3 ο ΔΙΕΡΓΑΣΙΕΣ (PROCESSES)

Κληρονομικότητα. Παύλος Εφραιμίδης pefraimi <at> ee.duth.gr. Java Κληρονομικότητα 1

Εισαγωγή στον Αντικειμενοστρεφή Προγραμματισμό Διάλεξη #2

Παύλος Εφραιµίδης. Java. Κληρονοµικότητα

Αντικειμενοστρεφής Προγραμματισμός

Ειδικά Θέματα Προγραμματισμού

Παράλληλη Επεξεργασία

Προγραμματισμός Ι (ΗΥ120)

Δομές Δεδομένων & Ανάλυση Αλγορίθμων. 3ο Εξάμηνο. Ουρά (Queue) Υλοποίηση της με τη βοήθεια πίνακα.

Εισαγωγή στον Προγ/μό Η/Υ

Αντικειμενοστρεφής Προγραμματισμός

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ

Οντοκεντρικός Προγραμματισμός

Επιτεύγµατα των Λ.Σ.

Λειτουργικά Συστήματα Η/Υ

Διεργασίες και Νήματα (2/2)

Χειρισµός Σφαλµάτων. Γρηγόρης Τσουµάκας. Τµήµα Πληροφορικής, Αριστοτέλειο Πανεπιστήµιο Θεσσαλονίκης. Έκδοση:

Ο βασικός παράγοντας είναι ο χρόνος αξιοποίησης του επεξεργαστή Ελάχιστος αριθµός πράξεων και όχι µακρόχρονες αιτήσεις Ε/Ε

Εισαγωγή στην Πληροφορική

Αδιέξοδα Ανάθεση Πόρων (Deadlocks Resource Allocation)

Αντικειμενοστρέφεια. Henri Matisse, Harmony in Red, Κωστής Σαγώνας Νίκος Παπασπύρου

Αντικειµενοστραφής Προγραµµατισµός

Δημιουργία & Τερματισμός Διεργασιών. Προγραμματισμός II 1

Λειτουργικά Συστήματα Η/Υ

Βασικές Έννοιες Πρ Ταο υγρ τόα χ μ ρ μ ο α ν τισμ ος Π ό ρ ςο ΙΙΙ γραμματισμός 1

ΚΑΤΑΣΚΕΥΑΣΤΕΣ ΑΝΤΙΓΡΑΦΗΣ

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 18/3/2008

Κεφάλαιο 4 Διεργασίες Β Τάξη ΕΠΑΛ

Εργαστήριο 02: Προγραμματισμός με Γενικούς Τύπους (JAVA Generics) ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι

Mεταβλητές (variables) και Σταθερές (constants)

Εισαγωγή στον Αντικειμενοστρεφή Προγραμματισμό Διάλεξη #15

Προγραμματισμός 2 Σημειώσεις εργαστηρίου

HelloWorld. Παύλος Εφραιμίδης. Java Το πρόγραμμα HelloWorld 1

Ενότητα 2 (Κεφάλαιο 3) Περιγραφή και Έλεγχος Διεργασιών. Περιεχόμενα. Ανάγκη ύπαρξης διεργασιών 1

Εαρινό. Ύλη εργαστηρίου, Ασκήσεις Java

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

ροµολόγηση Επεξεργαστή

Προγραµµατιστικές τεχνικές

Κλάσεις. Τροποποιητές, ιασυνδέσεις, Πακέτα. Τροποποιητές ελέγχου προσπέλασης µεταβλητών και µεθόδων

Εισαγωγή στον Προγραµµατισµό, Αντώνιος Συµβώνης, ΣΕΜΦΕ, ΕΜΠ,, Slide 6

Αδιέξοδα Ανάθεση Πόρων (Deadlocks Resource Allocation)

ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ. Κάθε υποπρόγραμμα έχει μόνο μία είσοδο και μία έξοδο. Κάθε υποπρόγραμμα πρέπει να είναι ανεξάρτητο από τα άλλα.

Εργαστήριο 1-1 η Άσκηση - Ανάλυση

Διδάσκων: Παναγιώτης Ανδρέου

Λιβανός Γιώργος Εξάμηνο 2017Β

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Transcript:

Καρακασίδης Αλέξανδρος Καστίδου Γεωργία Παπαφώτη Μαρία Πέτσιος Κων/νος Στέφανος Σαλτέας Καλογεράς Παναγιώτης Threads in Java ΝΗΜΑΤΑ ΣΤΗ JAVA 1. Εισαγωγή Τι είναι Νήµα; Κάθε νήµα εκτέλεσης είναι ουσιαστικά µια ανεξάρτητη ροή του ελέγχου εκτέλεσης, µέσα στο πρόγραµµα. Η έννοια του νήµατος (thread) είναι παρόµοια µε αυτήν της διεργασίας (process), µε τη διαφορά ότι τα διάφορα νήµατα µοιράζονται τον ίδιο χώρο διευθύνσεων, κάτι που δε συµβαίνει συνήθως µε τις διεργασίες. Με άλλα λόγια δυο διαφορετικά νήµατα µέσα σε ένα πρόγραµµα έχουν τη δυνατότητα πρόσβασης σε κάποιο αντικείµενο του προγράµµατος ενώ δυο διαφορετικές διεργασίες συνήθως βλέπουν διαφορετικά αντίγραφα του ίδιου αντικειµένου. 2. Σχέση Νηµάτών και ιεργασιών Για την καλύτερη κατανόηση της τεχνολογίας των νηµάτων, θα ήταν χρήσιµο να διευκρινιστεί η σχέση µεταξύ µίας διεργασίας και ενός νήµατος. Ένα νήµα ανήκει σε µία διεργασία, και χρησιµοποιεί τους πόρους αυτής της διεργασίας. Το νήµα όµως κατέχει τη δική του, αυτόνοµη ροή ελέγχου. Σε µία διεργασία µπορούν να ανήκουν πολλά νήµατα. Μία καλύτερη περιγραφή προκύπτει αν θεωρήσουµε το νήµα σαν µία διαδικασία η οποία να µπορεί να εκτελείται αυτόνοµα σε µία διεργασία.

Σχήµα 1: ιεργασίες και Νήµατα Μία διεργασία δηµιουργείται από το λειτουργικό σύστηµα. Οι διεργασίες περιέχουν πληροφορίες για τους πόρους του προγράµµατος, καθώς και για την κατάσταση εκτέλεσης του προγράµµατος, συµπεριλαµβανοµένων: Ταυτότητα διεργασίας, ταυτότητα οµάδας διεργασίας, ταυτότητα χρήστη κ.τ.λ. Περιβάλλον εκτέλεσης Κατάλογος εργασίας Εντολές του προγράµµατος Καταχωρητές Στοίβα Κοινός χώρος διευθύνσεων, σωρός δεδοµένων και µνήµης είκτες αρχείων ιαµοιραζόµενες βιβλιοθήκες Εργαλεία διαδιεργασιακής επικοινωνίας (όπως ουρές µηνυµάτων, σωληνώσεις, σηµαφόροι, ή κοινή µνήµη)

Σχήµα 2: Χαρακτηριστικά µία διεργασίας Τα νήµατα χρησιµοποιούν και υπάρχουν µέσα στους πόρους της διεργασίας, ενώ µπορούν να προγραµµατιστούν από το λειτουργικό σύστηµα και να εκτελούνται ως αυτόνοµες οντότητες εντός της διεργασίας στην οποία ανήκουν. Ένα νήµα µπορεί να έχει ανεξάρτητη ροή ελέγχου, και να είναι προγραµµατίσιµο γιατί διατηρεί: Στοίβα Ιδιότητες χρονοπρογραµµατισµού (όπως προτεραιότητα) Σύνολο σηµάτων σε αναµονή και σε διακοπή εδοµένα των νηµάτων.

Σχήµα 3: Χαρακτηριστικά ενός νήµατος Σε µία διεργασία µπορεί να ανήκουν πολλά νήµατα, τα οποία µοιράζονται τους πόρους της και εκτελούνται στον ίδιο χώρο διευθύνσεων. Σε ένα πολυνηµατικό πρόγραµµα (multi-threaded program) υπάρχουν ανά πάσα στιγµή πολλαπλά σηµεία εκτέλεσης. Ο διαµοιρασµός των πόρων από τα νήµατα έχει τα εξής αποτελέσµατα: Οι αλλαγές που πραγµατοποιούνται από ένα νήµα στους διαµοιραζόµενους πόρους (όπως, για παράδειγµα, το κλείσιµο ενός αρχείου), είναι ορατές από όλα τα άλλα νήµατα. ύο δείκτες που έχουν την ίδια τιµή αναφέρονται στο ίδιο δεδοµένο. Είναι δυνατή η ανάγνωση και η εγγραφή στην ίδια θέση µνήµης. Τέλος, οι ιδιότητες αυτές των νηµάτων παρέχουν διαφορετικές ιδιότητες, ανάλογα µε το περιβάλλον στο οποίο χρησιµοποιούνται. Σε ένα µονοεπεξεργαστικό σύστηµα, οι πολυνηµατικές διεργασίες παρέχουν ταυτόχρονη εκτέλεση. Σε ένα πολυεπεξεργαστικό περιβάλλον, µία πολυνηµατική διεργασία προσφέρει παραλληλισµό.

3. ηµιουργία Νηµάτων στην JAVA Όταν αρχίζει η εκτέλεση ενός Java προγράµµατος, µπορεί κανείς να φαντασθεί ότι υπάρχει µόνο ένα νήµα εκτέλεσης. Η παρατήρηση αυτή δεν είναι ακριβής αφού πρώτον µαζί µε κάθε νήµα εκτέλεσης ενός Java προγράµµατος τρέχει τουλάχιστον και ο συλλέκτης σκουπιδιών και δεύτερον στην περίπτωση των Java applets, ο αριθµός των νηµάτων εκτέλεσης αυξάνεται κατά πολύ επειδή δηµιουργεί νέα νήµατα το ίδιο το σύστηµα όποτε το κρίνει σκόπιµο. Για να δηµιουργήσει όµως ο χρήστης ένα νέο νήµα, πρέπει να δηµιουργήσει ένα νέο αντικείµενο, που να προέρχεται από την κλάση Thread, που ορίζεται στο πακέτο java.lang, ή από κάποια υποκλάση της. Το νέο αυτό αντικείµενο παριστάνει µια νέα εργασία που πρέπει να αρχίσει να εκτελείται παράλληλα µε την παλιά. Υπάρχουν δύο τρόποι για την υλοποίηση νέων νηµάτων εκτέλεσης. Παρακάτω περιγράφονται και οι δύο αυτοί τρόποι. Σε κάθε περίπτωση ο κώδικάς που υλοποιεί τη νέα εργασία τοποθετείται σε µια µέθοδο µε όνοµα run. Πρώτος τρόπος για την υλοποίηση νέων νηµάτων εκτέλεσης. Η νέα εργασία υλοποιείται από µια µέθοδο µε το όνοµα run η οποία δηλώνεται ως µέθοδος µιας νέας κλάσης που δηµιουργείται και υλοποιεί τη διαπροσωπεία Runnable. Στο Σχήµα 4α φαίνεται ένα παράδειγµα µιας κλάσης που υλοποιεί την έπ άπειρον εκτύπωση στην οθόνη της τιµής ενός µετρητή. class CountingJob implements Runnable { private int counter; public CountingJob (int c) { counter = c; public void run( ) { while(true) System.out.println(counter++); CountingJob job = new CountingJob(1); Thread t = new Thread (job); t.start(); Σχήµα 4: Παράδειγµα δηµιουργίας νέου νήµατος εκτέλεσης (α) (β) Στη συνέχεια, για να αρχίσει η εκτέλεση της εργασίας, απαιτείται η δηµιουργία ενός αντικειµένου τύπου Thread, περνώντας σον κατασκευαστή του ένα αντικείµενο της νέας εργασίας ως παράµετρο. Η έναρξη της εκτέλεσης πραγµατοποιείται καλώντας τη µέθοδο start του αντικειµένου

Thread. Μετά την κλήση της start η εκτέλεση της νέας εργασίας συνεχιζεται είτε ώσπου να τελειώσει η εκτέλεση της µεθόδου Run, είτε µέχρι να κληθεί η µέθοδος stop του αντικειµένου Thread. Παράδειγµα του µέρους αυτού του κώδικα φαίνεται στο σχήµα 4β. Σηµειώνεται εδώ ότι είναι επίσης δυνατόν το αντικείµενο τύπου Thread να αποτελεί τµήµα της κλάσης CountingJob και η εκτέλεση της νέας εργασίας να αρχίζει στον κατασκευαστή αυτής της κλάσης. εύτερος τρόπος για την υλοποίηση νέων νηµάτων εκτέλεσης. Η νέα εργασία υλοποιείται από µια µέθοδο run που ορίζεται από µια νέα υποκλάση της Thread. Με βάση αυτόν τον τρόπο το παράδειγµα του Σχήµατος 4 θα είχε τη µορφή που φαίνεται στο Σχήµα 5. class CountingJob extends Thread { private int counter; public CountingJob (int c) { counter = c; start(); public void run( ) { while(true) System.out.println(counter++); Σχήµα 5: Παράδειγµα δηµιουργίας νέου νήµατος εκτέλεσης (2 ος τρόπος) 4. Χειρισµός Νηµάτων στην JAVA Εκτός από τις µεθόδους start και stop της κλάσης Thread που χρησιµοποιούνται για την εκκίνηση και τον τερµατισµό της εκτέλεσης ενός νήµατος η κλάση παρέχει κι άλλες µεθόδους για τον περαιτέρω χειρισµό των νηµάτων. Τέτοιες είναι οι: suspend και resume που χρησιµοποιούνται για την προσωρινή παύση της εκτέλεσης ενός νήµατος και την επανεκκίνηση της αντίστοιχα. Οι µέθοδοι αυτές σε αντίθεση µε τις start και stop µπορούν να κληθούν περισσότερες από µια φορές. sleep(n) χρησιµοποιείται για την καθυστέρηση ενός νήµατος εκτέλεσης κατά n milliseconds.

currentthread πρόκειται για µια στατική µέθοδο η οποία επιστρέφει το τρέχον νήµα εκτέλεσης και είναι χρήσιµή για την πρόσβαση στο αρχικό νήµα. setdaemon Η µέθοδος αυτή παίρνει ως παράµετρο µια τιµή Boolean. Αν η τιµή της παραµέτρου είναι true τότε το νήµα χαρακτηρίζεται ως δαίµων. Οι «δαίµονες» είναι νήµατα που καταστρέφονται αυτόµατα µετά τον τερµατισµό όλων των άλλων νηµάτων. setpriority Αυτή η µέθοδος χρησιµοποιείται για τον καθορισµό της προτεραιότητας εκτέλεσης του νήµατος. Η προτεραιότητα είναι µια αριθµητική τιµή : όσο µεγαλύτερη είναι αυτή τόσο περισσότερος χρόνος αφιερώνεται από τον υπολογιστή για την εκτέλεση του νήµατος. Με άλλα λόγια νήµατα µε µεγαλύτερη προτεραιότητα πριµοδοτούνται από το διερµηνέα της Java έναντι νηµάτων µε µικρότερη προτεραιότητα. yield Αυτή η µέθοδος χρησιµοποιείται για να παραχωρήσει ένα νήµα το χρόνο υπολογισµού που του έχει δοθεί. 5. Συγχρονισµός νηµάτων Στις περισσότερες περιπτώσεις, όταν πολλά νήµατα εκτέλεσης διαχειρίζονται το ίδιο σύνολο αντικειµένων, είναι επιθυµητό να υπάρχει συγχρονισµός στις εργασίες που επιτελούνται. Αυτό είναι απαραίτητο, γιατί διαφορετικά τα αποτελέσµατα ενδέχεται να είναι καταστροφικά. Αν, για παράδειγµα, ένα νήµα εκτέλεσης διαβάζει µια µεταβλητή ενός αντικειµένου την ίδια στιγµή που ένα άλλο νήµα εκχωρεί µια τιµή σε αυτή, το αποτέλεσµα και των δύο ενεργειών είναι εντελώς απρόβλεπτο. Το πρόβληµα του συγχρονισµού παράλληλων διεργασιών είναι εξαιρετικά δύσκολο, αφού εκτός από το να παρέχει τη δυνατότητα αποκλειστικής χρήσης στα αντικείµενα, ένας µηχανισµός συγχρονισµού πρέπει να εξασφαλίζει την αποφυγή αδιεξόδων. Η Java παρέχει έναν αρκετά απλό και εύχρηστο µηχανισµό για το συγχρονισµό των νηµάτων εκτέλεσης. Ο µηχανισµός αυτός βασίζεται στην έννοια του κλειδώµατος (lock). Κάθε αντικείµενο της Java µπορεί να θεωρηθεί ότι διαθέτει ένα κλειδί. Το ίδιο συµβαίνει και για κάθε κλάση. Προκειµένου να επιτευχθεί αποκλειστική πρόσβαση σε ένα σύνολο µεθόδων ενός αντικειµένου, αυτές δηλώνονται ως synchronized (συγχρονισµένες). Στη συνέχεια για να κληθεί µια συγχρονισµένη µέθοδος ενός

αντικειµένου, πρέπει να αποκτηθεί το κλειδί του αντικειµένου από το νήµα εκτέλεσης που πραγµατοποιεί την κλήση. Το κλειδί επιστρέφεται µετά την εκτέλεση της µεθόδου. Ας θεωρήσουµε για παράδειγµα την ακόλουθη κλάση SafeVariable. Η κλάση αυτή ορίζει δύο συγχρονισµένες µεθόδους get και put, που χρησιµοποιούνται για την ανάκτηση και την αποθήκευση µιας ακέραιας τιµής από ένα αντικείµενο (Σχήµα 6). public class SafeVariable { private int value; public synchronized int get() { return value; public synchronized void put(int v) { value = v; Σχήµα 6: Παράδειγµα κλάσης SafeVariable Με τη χρήση των µεθόδων αυτών εξασφαλίζονται ότι για κάθε αντικείµενο αυτής της κλάσης, το πολύ µια µέθοδος θα εκτελείται για κάθε χρονική στιγµή. Τα κλειδιά των κλάσεων χρησιµοποιούνται για στατικές συγχρονισµένες µεθόδους, κατά τρόπο παρόµοιο µε τα κλειδιά των αντικειµένων. Εκτός από τη δήλωση συγχρονισµένων µεθόδων, είναι δυνατός ο συγχρονισµός αυθαίρετων τµηµάτων κώδικα, µε χρήση και πάλι της λέξης synchronized. Για παράδειγµα, στο παρακάτω τµήµα κώδικα, προκειµένου να εκτελεστεί το εσωτερικό της εντολής πρέπει να αποκτηθεί το κλειδί του αντικειµένου obj. Αυτό το τµήµα κώδικα µπορεί όµως να ανήκει σε οποιαδήποτε µέθοδο, όχι απαραίτητα του αντικειµένου αυτού (σχήµα 7). synchronized (obj ) { // manipulate obj in some way Σχήµα 7: Χρήση µεθόδου synchronized Εκτός από το συγχρονισµό µεθόδων µε χρήση της λέξης synchronized, η Java παρέχει τη δυνατότητα συγχρονισµού µε τις µεθόδους wait και notify της κλάσης Object. Οι µέθοδοι αυτές ορίζονται για κάθε αντικείµενο, καθώς όλες οι κλάσεις

κληρονοµούν την Object. Οι κλήσεις σε αυτές τις µεθόδους πραγµατοποιούνται σχεδόν πάντα µέσα από συγχρονισµένες µεθόδους ή τµήµατα κώδικα. Με την κλήση της µεθόδου wait για κάποιο αντικείµενο, το τρέχον νήµα εκτέλεσης επιστρέφει το κλειδί του αντικειµένου. Αν το νήµα βρίσκεται σε µια συγχρονισµένη µέθοδο αυτού του αντικειµένου, η επιστροφή του κλειδιού έχει ως αποτέλεσµα να σταµατήσει προσωρινά η εκτέλεση του νήµατος. Αυτό είναι επιθυµητό στην περίπτωση που η εκτέλεση της εργασίας δεν είναι δυνατό να ολοκληρωθεί λόγω έλλειψης πληροφοριών, για τις οποίες πρέπει το τρέχον νήµα να περιµένει. Για να συνεχίσει η εκτέλεση θα πρέπει να συµβούν δύο πράγµατα : αφενός να, ενηµερωθεί το νήµα εκτέλεσης ότι µπορεί να συνεχίσει, µέσω της κλήσης στη µέθοδο notify του αντικειµένου από ένα άλλο νήµα, και αφετέρου να αποκτηθεί και πάλι το κλειδί. Για κάθε κλήση της µεθόδου notify ενός αντικειµένου, ο διερµηνέας της Java ενηµερώνει µόνο µια µέθοδο που έχει εκτελέσει τη µέθοδο wait γι αυτό το αντικείµενο. Αν πρέπει να ενηµερωθούν όλες οι µέθοδοι που βρίσκονται σε αναµονή, µπορεί να χρησιµοποιηθεί η µέθοδο notifyall.

Αναφορές [1] Αλέξανδρος Καρακασίδης, «Πολυνηµατικός Προσοµοιωτής Ασύρµατου τοπικού δικτύου ΙΕΕΕ 802.11», ιπλωµατική Εργασία, Τµήµα Πληροφορικής, Πανεπιστήµιο Ιωαννίνων, Μάρτιος 2002. [2] Σοφοκλής Εφραιµίδης, Αντώνης Καβάρνος, Τάσος Κουτουµάνος, Βασίλης Παπαδήµος, Νίκος Παπασπύρου, Γιάννης Πατινιωτάκης, Κλειώ Σγουροπούλου, Εισαγωγή στη Γλώσσα Προγραµµατισµού Java. [3] Αndrew S. Tanenbaum and Maarten Van Steen, "Distributed Systems: Principles and Paradigms", Prentice Hall, 2002