Δικτυακός Προγραμματισμός (Θ)

Slides:



Advertisements
Παρόμοιες παρουσιάσεις
Κεφάλαιο 6 Threads. 2 Στον παραδοσιακό προγραμματισμό όταν ένα πρόγραμμα εκτελείται ονομάζεται process (διεργασία) και οι εντολές του εκτελούνται σειριακά.
Advertisements

Πηγές τάσης/ρεύματος R , L, C
Τέλος Ενότητας.
Μεταγλωττιστές (Compilers) (Θ) Ενότητα 13: Επαναληπτικό μάθημα Κατερίνα Γεωργούλη Τμήμα Μηχανικών Πληροφορικής ΤΕ Το περιεχόμενο του μαθήματος διατίθεται.
Η ανοσοαποτύπωση ως επιβεβαιωτική μέθοδος
Τριφασικά συμμετρικά δίκτυα σε συνδεσμολογία Υ (1/2)
Περιλήψεις Γιατί; Πως; Τι είναι; Ποιος τις κάνει;
Μεταγλωττιστές (Compilers) (Θ) Ενότητα 10: Παραγωγή Ενδιάμεσου Κώδικα (Σημασιολογικές ρουτίνες μετάφρασης-Μέρος Α) Κατερίνα Γεωργούλη Τμήμα Μηχανικών Πληροφορικής.
Αυτοματοποιημένη ευρετηρίαση
Διαμόρφωση πεδίων Περιγραφικά πεδία Διαχειριστικά πεδία Δομικά πεδία.
Μεταγλωττιστές (Compilers) (Θ) Ενότητα 11: Βελτιστοποίηση Ενδιάμεσου Κώδικα Κατερίνα Γεωργούλη Τμήμα Μηχανικών Πληροφορικής ΤΕ Ανοικτά Ακαδημαϊκά Μαθήματα.
Threads Στον παραδοσιακό προγραμματισμό όταν ένα πρόγραμμα εκτελείται ονομάζεται process (διεργασία) και οι εντολές του εκτελούνται σειριακά η μία μετά.
Διάνοιξη πόρων Με ακτινοβολούμενη θερμότητα. Θερμαινόμενα σίδερα.
Έλεγχος Ροής με την Εντολή Επανάληψης FOR 1/9
Καμπυλότητα Φακού P c
Τεχνολογία οφθαλμικών φακών Ι (Ε) Ενότητα 5: Έγχρωμοι φακοί Θεμιστοκλής Γιαλελής, Οπτικός, MSc, PhD candidate ΕΔΙΠ του τμήματος Οπτικής και Οπτομετρίας.
Συμπλήρωση Προτύπου Διδακτικού Σχεδιασμού
Eιδικά θέματα βάσεων χωρικών δεδομένων και θεωρία συστημάτων
Κανόνες Ασφαλείας Εργοταξίων
ΟΙΚΟΝΟΜΙΚΑ ΤΟΥ ΕΛΕΓΧΟΥ ΤΗΣ ΡΥΠΑΝΣΗΣ
Άλλες μορφές νευρώσεων
Διαχείριση παραγωγής εντύπων 1/2
Γιατί τρεφόμαστε ; Ενέργεια Απαραίτητα θρεπτικά συστατικά (nutrients)
Επικοινωνιακός Προγραμματισμός Ι
Άσκηση 8 (1 από 3) Προβολές 1. Να επιλέξετε ένα θέμα βασισμένο σε κάποια παράγραφο / υποπαράγραφο του κεφαλαίου 6 των σημειώσεων και να κάνετε μια εργασία.
Τεχνολογία οφθαλμικών φακών Ι (Ε)
Υπολογιστική Γεωμετρία και Εφαρμογές στις ΒΧΔ
Βασικά δεδομένα Το σύστημα υγείας δεν αποτελεί απλά άθροισμα επιμέρους μερών. Τα επιμέρους στοιχεία του συστήματος βρίσκονται σε συνεχή αλληλεξάρτηση.
Παρουσίαση ναυπηγικών γραμμών 1/3
Άρθρο Συγγραφείς: Marcus Plescia, MD, MPH, Martha Groblewski, PhD, RD, LDN. Τίτλος: A Community Oriented Primary care Demonstration Project Refining.
Ταυτότητα και περίγραμμα μαθήματος
Σύσταση και Ανάλυση Γλευκών και Οίνων (Θ)
Δίκτυα Υπολογιστών ΙΙ (Ε)
Άσκηση 7 (1 από 5) Υπολογισμοί μηκών τόξων σφαίρας. Το έτος 2035 μ.Χ., μετά από πυρηνική καταστροφή και λόγω του φαινομένου του θερμοκηπίου, που πήρε εκρηκτικές.
ΠΡΟΤΥΠΟ ΕΛΟΤ EN ISO 3251 Ζύγιση μάζας υγρού μελανιού (m1 g)
Ενότητα 13 Αξιολόγηση μαθήματος και διδάσκοντος από την εφαρμογή της Μονάδας Ολικής Ποιότητας (ΜΟΔΙΠ) του ΤΕΙ Αθήνας Αξιολόγηση του μαθήματος Αξιολόγηση.
Άσκηση 9 (1 από 2) Ανακαλύψτε στο χάρτη σας μερικά χαρτογραφικά αντικείμενα που να ανήκουν στις παρακάτω κατηγορίες : φυσικά, τεχνητές κατασκευές, αφηρημένα.
Τοπολογικές σχέσεις 1/3 Βρείτε και περιγράψτε τις τοπολογικές σχέσεις σύμφωνα με τους (Pantazis, Donnay 1996) για τα παρακάτω γεω-γραφικά αντικείμενα:
Επιλογή φλέβας για λήψη φλεβικού αίματος 1/7
Κανονικοποίηση ΤΙ ΕΙΝΑΙ ; Τεχνική Διαδικασία
Επικοινωνιακός Προγραμματισμός Ι
Εικαστικές συνθέσεις - Χρώμα στο χώρο
Γενική και Μαθηματική Χαρτογραφία (Ε)
Οργάνωση και Διοίκηση Πρωτοβάθμιας (Θ)
Λιθογραφία – Όφσετ (Θ) Ενότητα 8.2: Εκτυπωτική Διαδικασία Μηχανής
Επικοινωνιακός Προγραμματισμός Ι
Ενότητα 9: Συστήματα Υγείας στην Ευρώπη: Σουηδία
Αισθητική Σώματος Ι (Ε)
Αισθητική Σώματος Ι (Ε)
Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Αθήνας
Ειδικά θέματα βάσεων χωρικών δεδομένων και θεωρία συστημάτων -E
Γενική και Μαθηματική Χαρτογραφία (Ε)
Αισθητική Σώματος Ι (Ε)
Ενότητα 5.2: Αιθέρες Χριστίνα Φούντζουλα Τμήμα Ιατρικών Εργαστηρίων
Ενότητα 8: Συστήματα Υγείας στην Ευρώπη: Γαλλία
Βασικές κλινικές δεξιότητες (Ε)
Eιδικά θέματα βάσεων χωρικών δεδομένων και θεωρία συστημάτων -Θ
Συστήματα Θεματικής Πρόσβασης (Θ)
Ψυχιατρική Ενότητα 7: Συνέχεια σταδίων
Κοσμητολογία ΙΙ (Θ) Ενότητα 3: Kρέμες (γ’ μέρος)
Ανοσολογία (Ε) Ενότητα 3: Αιμοσυγκόλληση Πέτρος Καρκαλούσος
Γενική και Μαθηματική Χαρτογραφία (Ε)
Οργανική Χημεία (Ε) Ενότητα 2: Προσδιορισμός σημείου τήξης
Ενότητα 1: ……………….. Όνομα Επώνυμο Τμήμα __
Αισθητική προσώπου Ι (Ε)
Σύσταση και Ανάλυση Γλευκών και Οίνων (Θ)
Αισθητική ηλεκτροθεραπεία σώματος
Ενότητα 6: Δονήσεις Γεωργία Πέττα Τμήμα Φυσικοθεραπείας
Αισθητική ηλεκτροθεραπεία σώματος
Επικοινωνιακός Προγραμματισμός Ι
Μεταγράφημα παρουσίασης:

Δικτυακός Προγραμματισμός (Θ) Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Αθήνας Δικτυακός Προγραμματισμός (Θ) Ενότητα 2: Threads Ιωάννης Βογιατζής Τμήμα Μηχανικών Πληροφορικής ΤΕ Το περιεχόμενο του μαθήματος διατίθεται με άδεια Creative Commons εκτός και αν αναφέρεται διαφορετικά Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους.

Threads Στον παραδοσιακό προγραμματισμό όταν ένα πρόγραμμα εκτελείται ονομάζεται process (διεργασία) και οι εντολές του εκτελούνται σειριακά η μία μετά την άλλη μέχρι το τέλος του. Σ’ αυτή την περίπτωση μπορούμε να πούμε οτι το συγκεκριμένο process διαθέτει μόνο ένα thread που εκτελεί τις εντολές του προγράμματος. Στα multithreading συστήματα μπορούμε να ορίσουμε κάποιο process να περιέχει περισσότερα από ένα threads (lightweight processes) κάθε ένα από τα οποία εκτελεί μέρος του κώδικα του προγράμματος. Είναι σαν να έχουμε πολλά processes που εκτελούνται παράλληλα μέσα στο αρχικό process.

Single Thread/ Multiple Threads

Single-threaded vs multithreaded newThreads { { A1(); A2(); A3() }; {B1(); B2() } } { A(); A1(); A2(); A3(); B1(); B2(); }

Thread ecology in a java program started by java from main(String[]) started by main thread started by B thread lifetime of C thread

Παράδειγμα

Υλοποίηση των Threads (α΄ τρόπος) 1/12 Δημιουργία υποκλάσης της κλάσης Thread: Ενδείκνυται σε περιπτώσεις που η κλάση δεν απαιτείται να κληρονομήσει μεθόδους από κάποια κλάση εκτός της Thread. Στην υποκλάση της Thread ανατίθεται κώδικας προς εκτέλεση υπερκαλύπτοντας (override) τη μέθοδο run() της κλάσης Thread. To Thread συμπληρώνει τον κύκλο ζωής του όταν ολοκληρωθεί η εκτέλεση της μεθόδου run().

Βασικές μέθοδοι κλάσης Thread run(): Εμπεριέχει τον κώδικα που εκτελείται υπό την επίβλεψη του thread. Δεν έχει έννοια να κληθεί άμεσα. start(): εκκινεί την εκτέλεση του κώδικα που περιέχεται στη μέθοδο run() sleep(int t): αδρανοποιεί την εκτέλεση του Thread για t msec

Υλοποίηση Threads (α΄ τρόπος) 2/12 Ξεκινάμε από μια κλάση που εμφανίζει δέκα φορές το όνομά της (no thread). package simple; class Simple { String Name1; public Simple (String str) { Name1 = str; } public void run1() { for (int i = 0; i < 10; i++) { System.out.println(i + " " + Name1); } //for } // run1() //} //Simple public static void main(String[] args) { Simple S1; S1 = new Simple("TEI"); S1.run1();

Υλοποίηση Threads (α΄ τρόπος) 3/12 (Φυσικά η κλήση μπορεί να γίνει πιο απλά!) package simple; class Simple { String Name1; public Simple (String str) { Name1 = str; } public void run1() { for (int i = 0; i < 10; i++) { System.out.println(i + " " + Name1); } //for } // run1() //} //Simple public static void main(String[] args) { new Simple("TEI").run1(); //Simple S1; //S1 = new Simple("TEI"); //S1.run1();

Υλοποίηση των Threads (α΄ τρόπος) 4/12 Κάνουμε την κλάση Thread, οπότε αποκτάμε run, start package simple; class Simple extends Thread{ String Name1; public Simple (String str) { Name1 = str; } public void run() { for (int i = 0; i < 10; i++) { System.out.println(i + " " + Name1); } //for } // run() //} //Simple public static void main(String[] args) { Simple S1; S1 = new Simple("TEI"); S1.start();

Υλοποίηση των Threads (α΄ τρόπος) 5/12 Μπορούμε να χρησιμοποιήσουμε μεθόδους όπως: Methods  Type Method and Description String getName(): Returns this thread's name. boolean isDaemon(): Tests if this thread is a daemon thread. void setDaemon(boolean on): Marks this thread as either a daemon thread or a user thread. static void sleep(long millis) Causes the currently executing thread to sleep (temporarily cease execution) for the specified number of milliseconds, subject to the precision and accuracy of system timers and schedulers. start() Causes this thread to begin execution; the Java Virtual Machine calls the run method of this thread.

Υλοποίηση των Threads (α΄ τρόπος) 6/12 Μπορούμε να χρησιμοποιήσουμε τη getName package simple; class Simple extends Thread{ public Simple (String str) { super(str); } public void run() { for (int i = 0; i < 10; i++) { System.out.println(i + " " + getName()); } //for } // run() //} //Simple public static void main(String[] args) { new Simple("TEI").start();

Υλοποίηση των Threads (α΄ τρόπος) 7/12 Μπορούμε να χρησιμοποιήσουμε τη sleep package simple; class Simple extends Thread{ public Simple (String str) { super(str); } public void run() { for (int i = 0; i < 10; i++) { System.out.println(i + " " + getName()); try { sleep(1000); //sleep((int)(Math.random() * 1000)) } catch (InterruptedException e) {} } //for } // run() //} //Simple public static void main(String[] args) { new Simple("TEI").start();

Υλοποίηση των Threads (α΄ τρόπος) 8/12 Περνάμε το χρόνο ως παράμετρο package simple; class Simple extends Thread{ int sleeptime; public Simple (String str, int time) { super(str); this.sleeptime = time; } public void run() { for (int i = 0; i < 10; i++) { System.out.println(i + " " + getName()); try { sleep((int)(Math.random() * sleeptime)); } catch (InterruptedException e) {} } //for } // run() //} //Simple public static void main(String[] args) { new Simple("TEI", 1000).start();

Υλοποίηση των Threads (α΄ τρόπος) 9/12 package simple; class Simple extends Thread{ int sleeptime; public Simple (String str, int time) { super(str); this.sleeptime = time; } public void run() { for (int i = 0; i < 10; i++) { System.out.println(i + " " + getName()); try { sleep((int)(Math.random() * sleeptime)); } catch (InterruptedException e) {} } //for } // run() //} //Simple public static void main(String[] args) { new Simple("TEI", 1000).start(); new Simple("Athens", 2000).start(); Τι περίπου θα εμφανιστεί;

Υλοποίηση των Threads (α΄ τρόπος) 10/12 Btw… Τι θα γίνει αν αντί να καλέσω start καλέσω run; package simple; class Simple extends Thread{ int sleeptime; public Simple (String str, int time) { super(str); this.sleeptime = time; } public void run() { for (int i = 0; i < 10; i++) { System.out.println(i + " " + getName()); try { sleep((int)(Math.random() * sleeptime)); } catch (InterruptedException e) {} } //for } // run() //} //Simple public static void main(String[] args) { new Simple("TEI", 1000).run(); new Simple("Athens", 2000).run();

package simple; import java. io package simple; import java.io.IOException; class Simple extends Thread{ int sleeptime; public Simple (String str, int time) { super(str); this.sleeptime = time; } public void run() { for (int i = 0; i < 10; i++) { System.out.println(i + " " + getName()); try { sleep((int)(Math.random() * sleeptime)); } catch (InterruptedException e) {} } //for } // run() //} //Simple public static void main(String[] args) { Simple S1 = new Simple("TEI", 500); S1.setDaemon(true); S1.start(); System.in.read(); System.out.println("Enter pressed...\n"); } catch (IOException e) { }

Υλοποίηση των Threads (α΄ τρόπος) 11/12 class SimpleThread extends Thread { public SimpleThread(String str) { super(str); //Ανάθεση ονόματος στο τρέχον Thread } public void run() { for (int i = 0; i < 10; i++) { System.out.println(i + " " + getName()); try { sleep((int)(Math.random() * 1000)); } catch (InterruptedException e) {} } //for } // run() } //SimpleThread

Υλοποίηση των Threads (α΄ τρόπος) 12/12 Output 0 Jamaica 0 Fiji 1 Fiji 1 Jamaica 2 Jamaica 2 Fiji 3 Fiji 3 Jamaica 4 Jamaica 4 Fiji 5 Jamaica 5 Fiji 6 Fiji 6 Jamaica 7 Jamaica 7 Fiji 8 Fiji 9 Fiji 8 Jamaica DONE! Fiji 9 Jamaica DONE! Jamaica H κλάση TwoThreadTest διαθέτει την μέθοδο main στην οποία δημιουργούνται δυο threads – ένα που που ονομάζεται Jamaica και ένα που ονομάζεται Fiji. class TwoThreadsTest { public static void main (String[] args) { new SimpleThread("Jamaica").start(); new SimpleThread("Fiji").start(); }

Υλοποίηση των Threads με interfaces (β’ τρόπος) public class AppletWithThread extends Applet extends Thread {……..} ΛΑΘΟΣ (Η Java δεν υποστηρίζει πολλαπλή κληρονομικότητα) Στην περίπτωση αυτή, η αξιοποίηση της λειτουργικότητας των Threads είναι εφικτή με τη χρήση ενός interface. Runnable interface: Επιβάλλει τον ορισμό μιας μεθόδου public void run( ) στις κλάσεις που το υλοποιούν

Υλοποίηση Threads (β’ τρόπος) 1/2 Δημιουργία κλάσης που υλοποιεί το Runnable interface. Δημιουργία ενός Thread με όρισμα στον κατασκευαστή αντικείμενο κλάσης η οποία υλοποιεί το Runnable interface. public class MyClass implements Runnable{ ……….. Thread MyThread; public void myMethod(){ MyThread = new Thread(this, "ThreadName"); ……………. } ...........................

Υλοποίηση Threads (β’ τρόπος) 2/2 import static java.lang.Thread.*; public class ImplEx1 implements Runnable { String Name; public ImplEx1(String str) { Name = str; } public void run() { for (int i = 0; i < 10; i++) { System.out.println(i + " " + Name); try { sleep((int)(Math.random() * 1000)); } catch (InterruptedException e) {} } //for } // run() public static void main (String[] args) { new Thread (new ImplEx1("Jamaica")).start(); new Thread (new ImplEx1("Fiji")).start(); } //SimpleThread

Σύνοψη Για τη δημιουργία threads χρησιμοποιήθηκαν δύο διαφορετικοί κατασκευαστές: Για υποκλάσεις της Thread: Thread(String name) String name: το όνομα του Thread Για κλάσεις με υπερκλάση≠Thread Thread(Runnable obj, String name) Runnable Obj: αντικείμενο που υλοποιεί το Runnable interface String name: το όνομα που ανατίθεται στο Thread

Παράδειγμα (non-synchronized) 1/2 package jumblenames; import java.io.IOException; public class JumbleNames implements Runnable { //extends Thread { final private String firstName; final private String secondName; final private long aWhile; public JumbleNames(String firstName, String secondName, long delay) { this.firstName = firstName; this.secondName = secondName; aWhile = delay; } @Override public void run() { try { while(true) { System.out.print(firstName); Thread.sleep(aWhile); System.out.print(secondName+"\n"); } } catch(InterruptedException e) {}

Παράδειγμα (non-synchronized) 2/2 public static void main(String[] args) { Thread first, second, third; JumbleNames JN1; JN1 = new JumbleNames("Nik ", "Nikolaou ", 200); first = new Thread(JN1); second = new Thread(new JumbleNames("Chr ", "Christou ", 300)); third = new Thread(new JumbleNames("Pet ", "Petrou ", 500)); first.setDaemon(true); second.setDaemon(true); third.setDaemon(true); System.out.println("Press Enter when you have had enough...\n"); first.start(); second.start(); third.start(); try { System.in.read(); System.out.println("Enter pressed...\n"); } catch (IOException e) {} System.out.println("Ending main()"); }

Συγχρονισμός Threads Ανάγκη ελέγχου πρόσβασης σε κάποιες κοινές (για δύο ή περισσότερα Threads) οντότητες. Ανάγκη ελέγχου της σειράς με την οποία εκτελούνται κάποιες λειτουργίες Οι κοινές μεταβλητές θα πρέπει να είναι προσβάσιμες από τα Threads μέσω κάποιων μεθόδων Κάθε στιγμή θα πρέπει να εκτελείται μόνο μία από τις μεθόδους αυτές

Έλεγχος πρόσβασης-Synchronized μέθοδοι Ένα αντικείμενο που περιέχει synchronized μεθόδους χαρακτηρίζεται ως αντικείμενο τύπου monitor. Ένα αντικείμενο τύπου monitor επιτρέπει σε ένα μόνο thread κάθε στιγμή να εκτελεί μόνο μία από τις synchronized μεθόδους αυτού του αντικειμένου. Επομένως όταν καλείται κάποια synchronized μέθοδος ενός αντικειμένου, το αντικείμενο δεσμεύεται από το thread και δεν μπορεί να κληθεί καμία άλλη synchronized μέθοδος στο συγκεκριμένο αντικείμενο από κάποιο άλλο thread. Ο περιορισμός πρόσβασης ισχύει μόνο για synchronized μεθόδους. Νon-synchronized μέθοδοι μπορούν να κληθούν χωρίς περιορισμό. Μετά το τέλος της εκτέλεσης μιας synchronized μεθόδου, το αντικείμενο που την περιέχει αποδεσμεύεται.

Η εντολή wait() Καλείται μέσα από μια synchronized μέθοδο Κλήση της wait() έχει ως αποτέλεσμα το thread που εκτελεί την αντίστοιχη synchronized μέθοδο να τίθεται σε κατάσταση αναμονής. Το αντίστοιχο monitor αντικείμενο που περιέχει τη synchronized μέθοδο γίνεται διαθέσιμο προς χρήση. Συνεπώς κάποιο άλλο Thread (που δε βρίσκεται σε κατάσταση αναμονής) μπορεί να καλέσει μια από τις synchronized μεθόδους του.

Οι μέθοδοι notify(), notifyAll() Όπως και η εντολή wait(), οι notify(), notifyAll() καλούνται μέσα σε synchronized μεθόδους. Εκτέλεση της μεθόδου notify() “ενεργοποιεί” ένα από τα threads που βρισκόταν σε κατάσταση αναμονής για το συγκεκριμένο monitor αντικείμενο. Το “ενεργοποιημένο” thread, δε θα είναι σε θέση να εκτελεσθεί, έως ότου το τρέχον thread ολοκληρώσει την εκτέλεση της synchronized μεθόδου - δηλαδή ξεκλειδώσει το monitor αντικείμενο. Εάν πολλά thread περιμένουν σε αυτό το αντικείμενο, ένα μόνο από αυτά επιλέγεται για να “ξυπνήσει” - η επιλογή γίνεται αυθαίρετα από το σύστημα. Η μέθοδος notifyAll(), “ξυπνά” όλα τα threads που βρίσκονται σε κατάσταση wait για το συγκεκριμένο monitor αντικείμενο. Έπειτα το monitor αντικείμενο θα δεσμευτεί από το πρώτο thread που θα προλάβει να το κλειδώσει.

Παράδειγμα συγχρονισμού (Producer-Consumer model) Producer: Thread που παράγει αύξουσα ακολουθία ακεραίων Consumer: Thread που παραλαμβάνει αύξουσα σειρά ακεραίων Cubbyhole: κοινό αντικείμενο που αποθηκεύει και παρέχει αύξουσα ακολουθία ακεραίων

Παράδειγμα συγχρονισμού 1/5 Ο Producer παράγει έναν ακέραιο αριθμό μεταξύ [0, 9]. τον αποθηκεύει σε ένα κοινόχρηστο αντικείμενο CubbyHole τυπώνει τον αριθμό. public class Producer extends Thread { private CubbyHole cubbyhole; private int number; public Producer(CubbyHole c, int number) { cubbyhole = c; this.number = number; } public void run() { for (int i = 0; i < 10; i++) { cubbyhole.put(i); System.out.println("Producer #"+this.number+"put:"+i); try { sleep((int)(Math.random() * 1000)); } catch (InterruptedException e) { }

Παράδειγμα συγχρονισμού 2/5 Ο Consumer, καταναλώνει όλους τους ακέραιους αριθμούς από το CubbyHole Πρόκειται για το ίδιο αντικείμενο στο οποίο ο Producer έβαλε τους ακέραιους αριθμούς αρχικά. public class Consumer extends Thread { private CubbyHole cubbyhole; private int number;   public Consumer(CubbyHole c, int number) { cubbyhole = c; this.number = number; } public void run() { int value = 0; for (int i = 0; i < 10; i++) { value = cubbyhole.get(); System.out.println("Consumer#"+this.number+"got:"+ value);

Παράδειγμα συγχρονισμού 3/5 public class CubbyHole { private int contents; private boolean available = false;   public synchronized int get() { while (available == false) { try { wait(); } catch (InterruptedException e) {} } available = false; System.out.println("in get"); notifyAll(); return contents;   ………………………………… Ο συγχρονισμός μεταξύ αυτών των δύο threads υλοποιείται σε χαμηλότερο επίπεδο, μέσα στις μεθόδους get() και put() του αντικειμένου CubbyHole.

Παράδειγμα συγχρονισμού 4/5 Ο συγχρονισμός μεταξύ αυτών των δύο threads υλοποιείται σε χαμηλότερο επίπεδο, μέσα στις μεθόδους get() και put() του αντικειμένου CubbyHole. …………………. public synchronized void put(int value) { while (available == true) { try { wait(); } catch (InterruptedException e) { } } contents = value; available = true; System.out.println("in put"); notifyAll(); Output . . . Consumer #1 got: 3 Producer #1 put: 4 Producer #1 put: 5 Consumer #1 got: 5

Παράδειγμα συγχρονισμού 5/5 Output . . . Consumer #1 got: 3 Producer #1 put: 4 Producer #1 put: 5 Consumer #1 got: 5 public class ProducerConsumerTest { public static void main(String[ ] args) { CubbyHole c = new CubbyHole(); Producer p1 = new Producer(c, 1); Consumer c1 = new Consumer(c, 1); p1.start(); c1.start(); }

Καταστάσεις των Threads

Τέλος Ενότητας

Σημειώματα

Σημείωμα Αναφοράς Copyright Τεχνολογικό Εκπαιδευτικό Ίδρυμα Αθήνας, Ιωάννης Βογιατζής 2015. Ιωάννης Βογιατζής. «Δικτυακός Προγραμματισμός (Θ). Ενότητα 2: Threads». Έκδοση: 1.0. Αθήνα 2014. Διαθέσιμο από τη δικτυακή διεύθυνση: ocp.teiath.gr.

Σημείωμα Αδειοδότησης Το παρόν υλικό διατίθεται με τους όρους της άδειας χρήσης Creative Commons Αναφορά, Μη Εμπορική Χρήση Παρόμοια Διανομή 4.0 [1] ή μεταγενέστερη, Διεθνής Έκδοση. Εξαιρούνται τα αυτοτελή έργα τρίτων π.χ. φωτογραφίες, διαγράμματα κ.λ.π., τα οποία εμπεριέχονται σε αυτό. Οι όροι χρήσης των έργων τρίτων επεξηγούνται στη διαφάνεια «Επεξήγηση όρων χρήσης έργων τρίτων». Τα έργα για τα οποία έχει ζητηθεί άδεια αναφέρονται στο «Σημείωμα Χρήσης Έργων Τρίτων». [1] http://creativecommons.org/licenses/by-nc-sa/4.0/ Ως Μη Εμπορική ορίζεται η χρήση: που δεν περιλαμβάνει άμεσο ή έμμεσο οικονομικό όφελος από την χρήση του έργου, για το διανομέα του έργου και αδειοδόχο που δεν περιλαμβάνει οικονομική συναλλαγή ως προϋπόθεση για τη χρήση ή πρόσβαση στο έργο που δεν προσπορίζει στο διανομέα του έργου και αδειοδόχο έμμεσο οικονομικό όφελος (π.χ. διαφημίσεις) από την προβολή του έργου σε διαδικτυακό τόπο Ο δικαιούχος μπορεί να παρέχει στον αδειοδόχο ξεχωριστή άδεια να χρησιμοποιεί το έργο για εμπορική χρήση, εφόσον αυτό του ζητηθεί.

Επεξήγηση όρων χρήσης έργων τρίτων Δεν επιτρέπεται η επαναχρησιμοποίηση του έργου, παρά μόνο εάν ζητηθεί εκ νέου άδεια από το δημιουργό. © διαθέσιμο με άδεια CC-BY Επιτρέπεται η επαναχρησιμοποίηση του έργου και η δημιουργία παραγώγων αυτού με απλή αναφορά του δημιουργού. διαθέσιμο με άδεια CC-BY-SA Επιτρέπεται η επαναχρησιμοποίηση του έργου με αναφορά του δημιουργού, και διάθεση του έργου ή του παράγωγου αυτού με την ίδια άδεια. διαθέσιμο με άδεια CC-BY-ND Επιτρέπεται η επαναχρησιμοποίηση του έργου με αναφορά του δημιουργού. Δεν επιτρέπεται η δημιουργία παραγώγων του έργου. διαθέσιμο με άδεια CC-BY-NC Επιτρέπεται η επαναχρησιμοποίηση του έργου με αναφορά του δημιουργού. Δεν επιτρέπεται η εμπορική χρήση του έργου. Επιτρέπεται η επαναχρησιμοποίηση του έργου με αναφορά του δημιουργού και διάθεση του έργου ή του παράγωγου αυτού με την ίδια άδεια. Δεν επιτρέπεται η εμπορική χρήση του έργου. διαθέσιμο με άδεια CC-BY-NC-SA διαθέσιμο με άδεια CC-BY-NC-ND Επιτρέπεται η επαναχρησιμοποίηση του έργου με αναφορά του δημιουργού. Δεν επιτρέπεται η εμπορική χρήση του έργου και η δημιουργία παραγώγων του. διαθέσιμο με άδεια CC0 Public Domain Επιτρέπεται η επαναχρησιμοποίηση του έργου, η δημιουργία παραγώγων αυτού και η εμπορική του χρήση, χωρίς αναφορά του δημιουργού. Επιτρέπεται η επαναχρησιμοποίηση του έργου, η δημιουργία παραγώγων αυτού και η εμπορική του χρήση, χωρίς αναφορά του δημιουργού. διαθέσιμο ως κοινό κτήμα χωρίς σήμανση Συνήθως δεν επιτρέπεται η επαναχρησιμοποίηση του έργου.

Διατήρηση Σημειωμάτων Οποιαδήποτε αναπαραγωγή ή διασκευή του υλικού θα πρέπει να συμπεριλαμβάνει: το Σημείωμα Αναφοράς το Σημείωμα Αδειοδότησης τη δήλωση Διατήρησης Σημειωμάτων το Σημείωμα Χρήσης Έργων Τρίτων (εφόσον υπάρχει) μαζί με τους συνοδευόμενους υπερσυνδέσμους.

Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στo πλαίσιo του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Αθήνας» έχει χρηματοδοτήσει μόνο την αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους.