Πολυνηµατικές εφαρµογές σε Java



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ιαδικτυακές Εφαρµογές

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

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

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

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιδάσκων ηµήτριος Κατσαρός, Τµ. Μηχανικών Η/Υ, Τηλεπικοινωνιών & ικτύων Πανεπιστήµιο Θεσσαλίας

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

08 Πολυνηματικός προγραμματισμός στο JVM

6. Εξαιρέσεις στη γλώσσα Java

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

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

Φροντιστήριο Α' Κατανεμημένα Συστήματα Επιμέλεια: Μπούτσης Ιωάννης

ιαδικτυακές Εφαρµογές Πραγµατικού Χρόνου µε Java

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

14. Δικτύωση με Java Δικτύωση με Java Sockets Δημιουργία της σύνδεσης Διευθυνσιοδότηση της σύνδεσης

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. Εισαγωγή στα Java Νήµατα. Τι είναι ένα thread (1/9)

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

Εκφωνήσεις ασκήσεων εργαστηρίου 2 (java threads)

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

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

ΕΞΑΙΡΕΣΕΙΣ. Εξαιρέσεις προκαλούνται. από το σύστηµα. από το πρόγραµµα

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

Εισαγωγή στη γλώσσα προγραμματισμού JAVA. Δομές Δεδομένων Διδάσκων: Π.Α. Μήτκας Τομέας Ηλεκτρονικής και Υπολογιστών

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εξαιρέσεις

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

Generics και ArrayLists

10.1 Γενικά για τα streams

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III

Βασίλης Χριστοφίδης Επαναληπτική Εξέταση (3 ώρες) Ηµεροµηνία: 21 Σεπτεµβρίου 2012

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

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

ΕΙΣΟ ΟΣ-ΕΞΟ ΟΣ Ε ΟΜΕΝΩΝ

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

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

Μάθημα 2 [10/11/2015]

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

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

Ανάλυση Επιδόσεων Συστημάτων Πραγματικού Χρόνου

HY335 4ο Φροντιστήριο

ΕΠΛ233 ΠΛΗΡΟΦΟΡΙΑ ΤΥΠΟΥ. Type Information. Μ. Δικαιάκος

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Υπάρχουσες κλάσεις και αντικείμενα στην Java Strings Wrapper Classes Δομές

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα ως ορίσματα

ΑΝΑΚΕΦΑΛΑΙΩΣΗ. Τα βασικά για την γλώσσα Java

Εκτέλεση εξωτερικών προγραμμάτων και εντολών The Java Reflection - Αρχικοποίηση (Initialization)

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Constructors, equals, tostring

2 ΓΡΑΜΜΙΚΕΣ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

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

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

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

Προγραμματισμός ΙΙ (Java) 4. Διαχείριση εξαιρέσεων

Εργαστήριο Java. Αντικείµενο: Δίκτυα. Χειρισµός URLs. Άσκηση 1. Lab11. Πακέτο java.net

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ Αλγοριθμική και Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα

Εισαγωγή στη γλώσσα προγραμματισμού Java 69

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 6 : ΠΙΝΑΚΕΣ

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

Oι βασικές πράξεις (λειτουργίες) που ορίζονται για τον τύπο στοίβα αναφέρονται παρακάτω:

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 9 : ΕΞΑΙΡΕΣΕΙΣ ΚΑΙ Ο ΧΕΙΡΙΣΜΟΣ ΤΟΥΣ

Βασικά της γλώσσας JAVA

Ανάπτυξη δικτυακού παιχνιδιού με δυνατότητα συμμετοχής ακροατηρίου.

Εξαιρέσεις (Exceptions) Λάθη (Errors) Χειρισμός των Εξαιρέσεων (Exception Handling) Assertions

Φροντιστήριο Α' Κατανεμημένα Συστήματα Επιμέλεια: Μπούτσης Ιωάννης

ΗΥ-252 Οντοκεντρικός Προγραµµατισµός Βασίλης Χριστοφίδης. Επαναληπτική Εξέταση (3 ώρες) Ηµεροµηνία: 12 Σεπτεµβρίου 2002

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

Κατασκευαστές. Μέθοδοι Κατασκευής (Constructors).

Γαβαλάς Δαμιανός

ΠΛΗΡΟΦΟΡΙΚΗ ΙI Ενότητα 12: Ροές και είσοδος/έξοδος αρχείων

11β Δομικά πρότυπα σχεδίασης

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

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

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 6/12/07

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ. Χρονοπρογραμματισμός Εργαστηριακές Ασκήσεις

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

Δομές ελέγχου ροής προγράμματος

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Έλεγχος ισότητας String Interning Αποαναφοροποίηση - dereferencing


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

Transcript:

Πολυνηµατικές εφαρµογές σε Java Σταύρος Πολυβίου Τί είναι ένα νήµα (thread); Ας ορίσουµε πρώτα το τί είναι µία διεργασία (process): Ένα αυτοδύναµο περιβάλλον εκτέλεσης (selfcontained execution environment). ιαθέτει τους δικούς της αποκλειστικούς πόρους κατά το χρόνο εκτέλεσής της (run-time resources) µε πιόσηµαντικό αυτό της µνήµης. Μία εφαρµογή (application) δυνατό να αποτελείται από διάφορες συνεργαζόµενες διεργασίες. 1

Τί είναι ένα νήµα (thread); (2) Ένα νήµα είναι: Μία ελαφριά διεργασία (lightweight process). Είναι και αυτό ένα αυτοδύναµο περιβάλλον εκτέλεσης (self-contained execution environment). Κάθε διεργασία περιέχει ένα ή περισσότερα νήµατα εκτέλεσης (threads of execution). Όλατανήµατα µίας διεργασίας µοιράζονται από κοινού τους πόρους της διεργασίας, µοιράζονται δηλαδή πρωτίστως ένα κοινόχώροστηµνήµη. Πού χρησιµεύουν τα νήµατα; Όταν θέλουµε να υλοποιήσουµε µία εφαρµογή η οποία να µπορεί να εκτελέι ταυτόχρονα περισσότερες από µία εργασίες. Κάτι τέτοιο είναι ιδιαίτερα αναγκαίο σε διαδραστικές εφαρµογές (interactive applications) ώπου χρειάζεται συνεχής αλληλεπίδραση µε το χρήστη καθώς η εφαρµογή εκτελεί χρονοβόρες εργασίες στο παρασκήνιο. Σε αντίθεση µε τιςδιεργασίες, τα νήµατα µπορούν να δηµιουργηθούν µε µικρότερο επίβαρο (overhead) και συνεπώς µπορούν να υποστηρίξουν µε πιό αποδοτικό τρόπο την ταυτόχρονη διεκπεραίωση αυτών των εργασιών. Λόγω του ότι ενεργούν πάνω σε ένα κοινό χώρο στη µνήµη, τα νήµατα µπορούν να επικοινωνούν µεταξύ τους πιό γρήγορα από ότι οι διεργασίες, ωστόσο αυτό εγκυµονεί και κάποιους κινδύνους του οποίους θα εξετάσουµε στησυνέχεια. 2

Τί είναι ταυτοχρονία (concurrency); Στην πραγµατικότητα, σε ένα σύστηµα µε πολλές διεργασίες αλλά µε µόνο ένα επεξεργαστή, δηµιουργείται η ψευδαίσθηση της ταυτόχρονης εκτέλεσης των διεργασιών µέσω χρονοµερισµού (time slicing) t 0 t 1 2t 1 ιεργασία 1 ιεργασία 2 Επεξεργαστής Χρονοµερίδια (time-slices) Πραγµατική ταυτοχρονία Για την πραγµατική ταυτόχρονη εκτέλεση διεργασιών χρειαζόµαστε τόσους επεξεργαστές όσες καιοιδιεργασίες t 0 t 1 ιεργασία 1 ιεργασία 2 Επεξεργαστής 1 ιεργασία 1 Επεξεργαστής 2 ιεργασία 2 3

Γενική περίπτωση ταυτοχρονίας t 0 t 1 2t 1 ιεργασία 1 t 0 t 2 2t 2 ιεργασία 3 ιεργασία 2 ιεργασία 4 Επεξεργαστής 1 Επεξεργαστής 2 Χρονοµερίδια (time-slices) Χρονοµερίδια (time-slices) Πολυνηµατοποίηση (multithreading) Η κάθε διεργασία αποτελείται από πολλά νήµατα τα οποία εκτελούνται κατά τη δίαρκεια των χρονοµεριδίων που παραχωρούνται στη διεργασία στην οποία ανήκουν. t 0 t 1 t 2 t 1 +t 2 ιεργασία 1 ιεργασία 2 Επεξεργαστής Χρονοµερίδια (time-slices) 4

Χρονοπρογραµµατισµός νηµάτων (thread scheduling) Σε µία εφαρµογή, όλες οι διεργασίες χρονοπρογραµµατίζονται (are scheduled) από το λειτουργικό σύστηµα. Όλα τα σύγχρονα λειτουργικά συστήµατα χρησιµοποιούν χρονοµερισµό επίσης γνωστό ως υπέρτερη πολυέργεια (preemptive multitasking). Το ΛΣ µπορεί ανά πάσα στιγµή να θέσει σε αναµονή κάποια διεργασία και να παραχωρήσει τον επεξεργαστή σε κάποια άλλη διεργασία. Χρονοπρογραµµατισµός νηµάτων (thread scheduling) (2) Σε µία πολυνηµατική εφαρµογή, ο προγραµµατιστής είναι υπεύθυνος για τον χρονοπρογραµµατισµό τωννηµάτων µίας διεργασίας. ύο προσεγγίσεις: Συνεργατική νηµατοποίηση (cooperative threading) Το κάθε νήµα παραχωρεί τον επεξεργαστή στα άλλα νήµατα οικειοθελώς. Υπέρτερη νηµατοποίηση (preemptive threading) Περιοδικά το ΛΣ αφαιρεί τον επεξεργαστή από ένα νήµα και τον παραχωρεί σε κάποιο άλλο (χρονοµερισµός). 5

Χρονοπρογραµµατισµός νηµάτων (thread scheduling) (3) Ο χρονοπρογραµµατιστής νηµάτων (thread scheduler) της Java δυνατό να ακολουθεί είτε τη µία είτε την άλλη προσέγγιση. Γι αυτό το λόγο θα πρέπει ως προγραµµατιστές να γνωρίζουµε πωςνα γράφουµε πολυνηµατικές εφαρµογές που να λειτουργούν ορθά και µε τιςδύο προσεγγίσεις. ηµιουργία νηµάτων στην Java ύο τρόποι: ηµιουργία µίας κλάσης που να υλοποιεί τη διεπιφάνεια (interface) Runnable. Πλεονέκτηµα: η κλάσηαυτήµπορεί να είναι υποκλάση οποιαδήποτε άλλης κλάσης. ηµιουργία µίας υποκλάσης (subclass) της κλάσης Thread. Πλεονέκτηµα: πιό απλή προσέγγιση, κατάλληλη για απλές εφαρµογές. Μειονέκτηµα: τα νήµατα περιορίζονται στο να είναι υποκλασεις της συγκεκριµένης κλάσης. 6

Υλοποιόντας τη διεπιφάνεια Runnable import java.lang.*; public class MyRunnable implements Runnable public void run() // Σε αυτή τη µέθοδο τοποθετούνται όλες // οι εντολές που εκτελούνται από το νήµα. // Μπορείτε να τη σκέφτεστε ως τη µέθοδο // main() µίας πολυνηµατικής εφαρµογής. // Με την ολοκλήρωση της εκτέλεσης της µεθόδου αυτής, // τερµατίζεται το νήµα. System.out.println( Hello World! ); Υλοποιόντας τη διεπιφάνεια Runnable (2) public static void main(string args[]) Thread mythread; // Γιαναξεκινήσετεένανέονήµα εκτέλεσης χρειάζεται να δηµιουργήσετε ένα νέο // αντικείµενο της κλάσης Thread. Ένας από τους constructor αυτής τη κλάσης // δέχεται ως παράµετρο κάποιο αντικείµενο οποιασδήποτε κλάσης το οποίο // υλοποιεί τη διεπιφάνεια Runnable. mythread = new Thread(new MyRunnable()); // Καλώντας τη µέθοδο start του νήµατος εκτελείται η µέθοδος run του // αντικειµένου που υλοποιεί τη διεπιφάνεια Runnable. mythread.start(); 7

ηµιουργόντας µία υποκλάση της κλάσης Thread import java.lang.*; Public class MyThread extends Thread // Αυτή τη φορά απλά αντικαθιστούµε τηµέθοδο run της υπερκλάσης Thread. public void run() System.out.println( Hello world! ); public static void main(string args[]) MyThread mythread = new MyThread(); mythread.start(); // Καλούµε τη µέθοδο start της δικής µας υποκλάσης. Εξήγηση της κλάσης Thread και της διεπιφάνειας Runnable package java.lang; public interface Runnable public abstract void run(); // Η διεπιφάνεια Runnable ορίζει µόνο µία µέθοδο. public class Thread implements Runnable // ΗκλάσηThread υλοποιεί τη διεπιφάνεια Runnable. private Runnable target; // Εδώ αποθηκεύεται η δική µας κλάση που υλοποιεί το Runnable. public void run() // Η µέθοδος start καλεί τη µέθοδο run... if (target!= null) target.run(); // η οποίαµε τη σειρά της καλεί τη µέθοδο run // της δικής µας κλάσης. 8

Αναστέλλωντας την εκτέλεση ενός νήµατος Όταν κάποιο νήµα βρίσκεται σε αναµονή, µπορεί να ανασταλεί η εκτέλεσή του µέχρις ώτου καταφθάσει το γεγονός που αναµένει. Με αυτό τον τρόπο αυξάνεται η απόδοση της πολυνηµατικής εφαρµογής µας αφού κάποιο άλλο νήµα πουδεβρίσκεταισε αναµονή µπορεί να εκτελεστεί στη θέση του προηγούµενου. Αναστέλλωντας την εκτέλεση ενός νήµατος (2) Στη Java αυτό γίνεται µε τη στατική µέθοδο sleep της κλάσης Thread. Σηµειώστε ότι µία στατική µέθοδος αφορά ολόκληρη την κλάση και όχι ένα συγκεκριµένο αντικείµενο που ανήκει στην κλάση. Οορισµός της µεθόδου αυτής είναι ο εξής: public static void sleep(long millis) throws InterruptedException ή public static void sleep(long millis, int nanos) throws InterruptedException 9

Αναστέλλωντας την εκτέλεση ενός νήµατος (3) Καλώντας την εν λόγω µέθοδο, θέτουµε κάποιο ελάχιστο χρονικό διάστηµα (π.χ. σε χιλιοστά του δευτερολέπτου) κατά το οποίο η εκτέλεση του νήµατος αναστέλεται. Μετά την παρέλευση αυτού του χρονικού διαστήµατος το νήµα επαναδραστηριοποιείται. Παράδειγµα χρήσηςτης µεθόδου sleep try Thread.sleep(4000); // Αναστολή της εκτέλεσης του νήµατος για 4 δευτερόλεπτα. catch (InterruptedException e) // Κώδικας που εκτελείται σε περίπτωση διακοπής του νήµατος καθώς «κοιµάται». Σε µία πολυνηµατική εφαρµογήδυνατόναυπάρχουνπολλάνήµατα (από την ίδια κλάση) τα οποία να περιέχουν τον πιο πάνω κώδικα. Στατικές µεθόδοι όπως η sleep επηρεάζουν το νήµα µέσα στο οποίο εκτελέστηκε το κάλεσµα στηνsleep. Για ευκολία θα αναφερόµαστε σε αυτό το νήµα ωςτο«παρών νήµα» (current thread). 10

ιακοπή της εκτέλεσης ενός νήµατος από κάποιο άλλο νήµα Είναι επίσης δυνατή η διακοπή της εκτέλεσης ενός νήµατος από κάποιο άλλο νήµα το οποίο διαθέτει την απαραίτητη πρόσβαση. Αυτό γίνεται µέσω της µεθόδου interrupt. Η µέθοδος αυτή ορίζεται ως ακολούθως: public void interrupt() throws SecurityException Σηµειώστε ότι είναι ακόµη δυνατό ένα νήµα να διακόψει τον εαυτό του. Κατά τη διακοπή της εκτέλεσής του το νήµα λαµβάνει ένα αντικείµενο της κλάσης InterruptedException. Σύζευξη νηµάτων Είναι ακόµη δυνατή η αναστολή της εκτέλεσης ενός νήµατος µέχρι τη συµπλήρωση της εκτέλεσης κάποιου άλλου νήµατος. Αυτό γίνεται µε τη µέθοδο join η οποία ορίζεται ως ακολούθως: public final void join(long millis) throws InterruptedException public final void join(long millis, int nanos) throws InterruptedException public final void join() throws InterruptedException Όπως παρατηρείτε, είναιδυνατήησυζευξηδύονηµάτων µε τον ορισµό ενόςµέγιστουχρόνουαναµονής ή µε απεριόριστο χρόνο αναµονής. Η σύζευξη πραγµατοποιείται µεταξύ του παρόντος νήµατος και του νήµατος του οποίου καλείται η µέθοδος join. Σε περίπτωση διακοπής του παρόντος νήµατος ενώ περιµένει, του επιστρέφεται ένα αντικείµενο της κλάσης InterruptedExpression. 11

Άλλες µέθοδοι της κλάσης Thread Γιατηδιακρίβωσητουκατάπόσοένανήµα εκτελέιται public final boolean isalive() Γιατηδιακρίβωσητουκατάπόσοέχειδιακοπείηεκτέλεσηενός νήµατος public boolean isinterrupted() Γιατηδιακρίβωσητουκατάπόσοέχειδιακοπείηεκτέλεσητου παρόντος νήµατος public static boolean interrupted() Για την αναστολή της εκτέλεσης του παρόντος νήµατος και τηνπαραχώρησητουεπεξεργαστήσεκάποιοάλλονήµα (συνεργατική πολυνηµατικότητα) public static void yield() Χρήσιµες µέθοδοι που κληρονοµούνται από την κλάση Object Θέση του νήµατος σε στάση αναµονής µέχρις ώτου κάποιο νήµα στείλει κάποια ειδοποίηση public final void wait(long timeout) throws InterruptedException public final void wait(long timeout, int nanos) throws InterruptedException public final void wait() throws InterruptedException Ειδοποίηση κάποιου νήµατος για επανεκκίνηση της εκτέλεσής του και ειδοποίηση όλων των νηµάτων για επανεκκίνηση των εκτελέσεών τους public final void notify() public final void notifyall() 12

ιάγραµµα καταστάσεων νηµάτων στη Java t1.start() Ready to run Thread.yield() ή αναστολή από το scheduler t1.run() ολοκληρώνεται Dead παρέλευση χρόνου ή ολοκλήρωση άλλου νήµατος t1.notify() Waiting t2.notifyall() t1.wait() επιλογή από το scheduler Running παράδοση δεδοµένων αίτηση δεδοµένων κλείσιµο υποδοχής από άλλο νήµα Sleeping Thread.sleep() ή Thread.join() Blocked (I/O) Echo server: ο πολυνηµατικός κώδικας του εξυπηρετητή import java.net.*; import java.io.*; public class EchoServer public static void main(string[] args) throws IOException if (args.length > 0) try port = Integer.parseInt(args[0]); catch (NumberFormatException e) System.err.println( Port must be an integer"); System.exit(1); else System.exit(1); 13

Echo server: ο πολυνηµατικός κώδικας του εξυπηρετητή (2) ServerSocket serversocket = null; try serversocket = new ServerSocket(port); catch (IOException e) System.err.println("Could not listen on port."); System.exit(1); Echo server: ο πολυνηµατικός κώδικας του εξυπηρετητή (3) Socket clientsocket = null; SocketHandler clientsockethandler = null; while (true) try clientsocket = serversocket.accept(); catch (IOException e) System.err.println("Accept failed."); System.exit(1); clientsockethandler = new SocketHandler(clientSocket); clientsockethandler.start(); 14

Echo server: ο πολυνηµατικός κώδικας του εξυπηρετητή (4) class SocketHandler extends Thread Socket incoming; SocketHandler(Socket incoming) this.incoming = incoming; public void run() try BufferedReader in = new BufferedReader(new InputStreamReader(incoming.getInputStream())); PrintStream out = new PrintStream(incoming.getOutputStream()); Echo server: ο πολυνηµατικός κώδικας του εξυπηρετητή (5) String inputline; while ((inputline = in.readline())!= null) out.println(inputline); if (inputline.trim().equals("bye.")) break; out.close(); in.close(); incoming.close(); 15

Echo server: ο πολυνηµατικός κώδικας του εξυπηρετητή (6) catch(ioexception e) System.err.println( Communication failed."); System.exit(1); Προβλήµατα πολυνηµατικών εφαρµογών Προκύπτουν λόγω του ότι τα νήµατα µοιράζονται µεταξύ τους κάποια πεδία και κάποια αντικείµενα. ύο προβλήµατα: Παρεµβολές νηµάτων (thread interference) Απώλεια συνοχής µνήµης (memory consistency errors) 16

Λύση: συγχρονισµός νηµάτων Την επόµενηφοράθαδούµε τους µηχανισµούς που µας δίδονται από την Java για το συγχρονισµόνηµάτων. Οσυγχρονισµός µε τη σειρά του δηµιουργεί κάποια άλλα προβλήµατα όπως deadlock, starvation και livelock. 17