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

Μέγεθος: px
Εμφάνιση ξεκινά από τη σελίδα:

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

Transcript

1 13. Νήματα Ολοκληρώνοντας αυτό το κεφάλαιο θα μπορείτε Να κατανοείτε την έννοια του νήματος (thread) Να δημιουργείτε διακριτά νήματα στη Java, που θα ελέγχουν τον κώδικα και τα δεδομένα που χρησιμοποιούνται από το νήμα αυτό Να ελέγχετε την εκτέλεση ενός νήματος και να γράφετε κώδικα ανεξάρτητο από την πλατφόρμα με χρήση νημάτων Να κατανοείτε ορισμένες από τις δυσκολίες που προκύπτουν όταν πολλά νήματα διαμοιράζονται δεδομένα Να κατανοείτε τη χρήση της δεσμευμένης λέξης synchronized στη Java για την προστασία των δεδομένων από καταστροφή Νήματα και χρήση νημάτων στη Java Τι είναι τα νήματα; Μία απλή, αλλά χρήσιμη, άποψη ενός υπολογιστή είναι ότι έχει μία CPU, που πραγματοποιεί κάποιους υπολογισμούς, κάποια ROM που περιέχει το πρόγραμμα που εκτελεί η CPU και κάποια RAM που περιέχει τα δεδομένα με βάση τα οποία λειτουργεί το πρόγραμμα. Σε αυτή την απλή άποψη υπάρχει μόνο μία εργασία που πραγματοποιείται σε κάθε χρονική στιγμή. Μία πιο πλήρης άποψη των περισσοτέρων σύγχρονων υπολογιστικών συστημάτων δίνει τη δυνατότητα να πραγματοποιούνται περισσότερες από μία εργασίες την ίδια χρονική στιγμή ή τουλάχιστον να έχουμε αυτή την αίσθηση. Σε αυτή τη φάση της συζήτησης δε μας ενδιαφέρει πώς επιτυγχάνεται αυτό το γεγονός, αλλά μόνο να λάβουμε υπόψη μας τα παρελκόμενα από προγραμματιστικής άποψης. Αν πραγματοποιούνται περισσότερες από μία εργασίες, είναι αντίστοιχο με το να έχουμε περισσοτέρους του ενός υπολογιστές. Για το κεφάλαιο αυτό θα θεωρήσουμε ότι ένα νήμα (thread), ή πλαίσιο εκτέλεσης ή συμφραζόμενα εκτέλεσης (execution context), είναι η οριοθέτηση μίας ιδεατής CPU με το δικό της κώδικα προγράμματος και τα δικά της δεδομένα. Η κλάση java.lang.thread στις βασικές βιβλιοθήκες της Java μάς επιτρέπει να δημιουργούμε και να ελέγχουμε τα νήματά μας. Στη συνέχεια θα γράφουμε Thread όταν αναφερόμαστε στην κλάση java.lang.thread και νήμα όταν αναφερόμαστε στην ιδέα συμφραζομένων εκτέλεσης Τρία μέρη ενός νήματος Ένα νήμα αποτελείται από τρία μέρη. Πρώτα υπάρχει η ίδια η ιδεατή CPU. Δεύτερον υπάρχει ο κώδικας που εκτελεί η CPU. Τρίτον υπάρχουν τα δεδομένα στα οποία εφαρμόζεται ο κώδικας 1

2 CPU Ένα νήμα ή συμφραζόμενα εκτέλεσης Κώδικας Δεδομένα Στη Java στην κλάση Thread εμπεριέχεται μία ιδεατή CPU. Όταν δημιουργείται ένα νήμα μεταβιβάζεται σε αυτό, μέσω των ορισμάτων της συνάρτησης δημιουργίας του, τα δεδομένα στα οποία θα πρέπει να λειτουργήσει. Είναι σημαντικό να τονίσουμε ότι αυτές οι τρεις απόψεις είναι ουσιαστικά ανεξάρτητες. Ένα νήμα μπορεί να εκτελεί τον ίδιο ή διαφορετικό κώδικα από ένα άλλο νήμα. Ένα νήμα μπορεί να έχει πρόσβαση στα ίδια ή σε διαφορετικά δεδομένα από ό,τι ένα άλλο νήμα Δημιουργία ενός νήματος Ας δούμε τον τρόπο με τον οποίο δημιουργείται ένα νήμα και να συζητήσουμε πώς χρησιμοποιούνται τα ορίσματα των συναρτήσεων δημιουργίας του για την παροχή του κώδικα και των δεδομένων για το νήμα κατά την εκτέλεσή του. Μία συνάρτηση δημιουργίας Thread δέχεται ένα όρισμα που είναι στιγμιότυπο ενός Runnable. Δηλαδή πρέπει να ορίσουμε μία κλάση η οποία θα υλοποιεί τη διεπαφή Runnable και στη συνέχεια να δημιουργήσουμε ένα στιγμιότυπο αυτής της κλάσης. Η αναφορά που προκύπτει είναι κατάλληλο όρισμα για τη συνάρτηση δημιουργίας που θέλουμε. Για παράδειγμα: public class Xyz implements Runnable { int i; public void run() { while (true) { System.out.println( Hello + i++); Μας επιτρέπει να δημιουργήσουμε ένα νήμα ως εξής: Runnable r = new Xyz(); Thread t = new Thread(r); Με δεδομένο αυτό έχουμε ένα νέο νήμα το οποίο εμπεριέχεται στην αναφορά του Thread t. Αυτό ετοιμάζεται για να εκτελέσει τον κώδικα που ξεκινά με τη μέθοδο run() της κλάσης Xyz. (Η διεπαφή Runnable απαιτεί την ύπαρξη μίας public void μεθόδου με το όνομα run().) Τα δεδομένα που χρησιμοποιεί το νήμα αυτό παρέχονται από το στιγμιότυπο της Xyz στο οποίο αναφερόμαστε ως r. 2

3 Το νέο νήμα Thread t CPU κλάση Xyz Κώδικας Δεδομένα Στιγμιότυπο r της Xyz Συνεπώς, εν περιλήψει, αναφερόμαστε σε ένα νήμα μέσω ενός στιγμιοτύπου του αντικειμένου Thread. Ο κώδικας που θα εκτελέσει αυτό το νήμα θα ληφθεί από την κλάση του αντικειμένου που μεταβιβάζεται στη συνάρτηση δημιουργίας του Thread. Η κλάση αυτή πρέπει να υλοποιεί τη διεπαφή Runnable. Τα δεδομένα στα οποία λειτουργεί το νήμα αυτό λαμβάνονται από το συγκεκριμένο στιγμιότυπο του Runnable που μεταβιβάζεται στη συνάρτηση δημιουργίας του Thread Εκκίνηση ενός Thread Αν και έχουμε δημιουργήσει ένα νήμα αυτό δεν ξεκινά να εκτελείται άμεσα. Για να το ξεκινήσουμε χρησιμοποιούμε τη μέθοδο start(). Η μέθοδος αυτή είναι στην κλάση Thread συνεπώς, με βάση τα πιο πάνω, λέμε απλά: t.start() Στο σημείο αυτό η ιδεατή CPU που βρίσκεται μέσα στο νήμα γίνεται εκτελέσιμη. Μπορείτε να το φανταστείτε σα να δίνετε ρεύμα στην ιδεατή CPU Χρονοπρογραμματισμός του νήματος Αν και το νήμα γίνεται εκτελέσιμο, αυτό δε σημαίνει απαραίτητα ότι ξεκινά άμεσα. Σε έναν υπολογιστή με μία μόνο CPU (πραγματική CPU), σαφώς μπορούμε να κάνουμε μόνο ένα πράγμα κάθε φορά. Ας δούμε τώρα τον τρόπο με τον οποίο κατανέμεται η CPU όταν θα μπορούσαν να εκτελούνται περισσότερα από ένα νήματα. Στη Java τα νήματα είναι προ-εκχωρητικά (pre-emptive), αλλά δεν εκτελούνται κατ ανάγκη με βάση χρονομερίδια (time-sliced). (Είναι ένα κοινό λάθος να πιστεύουμε ότι η προ-εκχώρηση ταυτίζεται με το χρονοπρογραμματισμό με βάση τα χρονομερίδια.) Το μοντέλο του προ-εκχωρητικού χρονοπρογραμματιστή είναι ότι πολλά νήματα μπορεί να είναι έτοιμα προς εκτέλεση, αλλά μόνο ένα εκτελείται στην πράξη. Η διεργασία αυτή θα συνεχίσει να εκτελείται μέχρις ότου είτε πάψει να είναι εκτελέσιμη είτε μία άλλη διεργασία υψηλότερης προτεραιότητας γίνει εκτελέσιμη. Στην περίπτωση αυτή λέμε ότι το νήμα χαμηλότερης προτεραιότητας προ-εκχωρείται από το νήμα υψηλότερης προτεραιότητας. Ένα νήμα μπορεί να πάψει να είναι διαθέσιμο για πλήθος λόγων. Μπορεί να έχει εκτελέσει μία κλήση Thread.sleep(), επί τούτου για να ζητήσει να παύσει για μία χρονική περίοδο. Μπορεί να χρειάζεται να περιμένει για κάποια αργή εξωτερική συσκευή, ίσως κάποιον δίσκο ή το χρήστη. 3

4 Όλα τα νήματα που είναι εκτελέσιμα αλλά δεν εκτελούνται διατηρούνται σε ουρές ανάλογα με την προτεραιότητά τους. Το πρώτο νήμα στη μη-κενή ουρά με την υψηλότερη προτεραιότητα θα εκτελεστεί. Όταν ένα νήμα πάψει να εκτελείται εξ αιτίας της προ-εκχώρησης, φεύγει από την εκτελούμενη κατάσταση και τοποθετείται στο τέλος της εκτελέσιμης ουράς. Με παρόμοιο τρόπο ένα νήμα που γίνεται εκτελέσιμο αφού έχει απενεργοποιηθεί (blocked) (απλή απενεργοποίηση ή πιθανή αναμονή για είσοδο/έξοδο) πάει πάντα στο τέλος της ουράς. Δεδομένου του ότι τα νήματα στη Java δεν χρησιμοποιούν κατ ανάγκη χρονομερίδια, και με την έλλειψη περισσότερο προηγμένης κατανόησης, και της κατάλληλης σχεδίασης του προγράμματος, πρέπει να είστε βέβαιοι ότι ο κώδικας για τα νήματά σας δίνει στα άλλα νήματα την ευκαιρία να εκτελεσθούν από καιρού εις καιρόν. Αυτό μπορεί να επιτευχθεί δίνοντας περιοδικά μία κλήση sleep(), όπως στον κεντρικό βρόχο. public class Xyz implements Runnable { public void run() { while (true) { // διάφορα ενδιαφέροντα πράγματα... // Ας δουλέψουν και οι άλλοι try { Thread.sleep(10); catch (InterruptedException e) { // το νήμα διακόπηκε από άλλο Παρατηρήστε τη χρήση των try και catch. Επίσης σημειώστε ότι η κλήση sleep() είναι μία static μέθοδος της κλάσης Thread και συνεπώς αναφερόμαστε σε αυτή ως Thread.sleep(x). Το όρισμα καθορίζει το ελάχιστο αριθμό milliseconds κατά τα οποία το νήμα θα παραμείνει ανενεργό. Η εκτέλεση του νήματος δε θα συνεχισθεί παρά μόνο όταν περάσει αυτή η χρονική περίοδος συν κάποια χρόνο στον οποίο τα υπόλοιπα νήματα θα απενεργοποιηθούν, επιτρέποντας στο νήμα να ξεκινήσει στην πράξη. Μία άλλη μέθοδος στην κλάση Thread, η yield() μπορεί να χρησιμοποιηθεί για να δώσει στα άλλα νήματα την ευκαιρία να εκτελεστούν χωρίς να σταματήσει στην πράξη το τρέχον νήμα, παρά μόνο αν αυτό είναι απαραίτητο. Αν είναι εκτελέσιμα άλλα νήματα της ίδιας προτεραιότητας η yield() τοποθετεί το νήμα που την κάλεσε στο τέλος της εκτελέσιμης ουράς και επιτρέπει να ξεκινήσει ένα άλλο νήμα. Αν δεν υπάρχουν εκτελέσιμα νήματα στην ίδια προτεραιότητα η yield() δεν κάνει τίποτα. Σημειώστε ότι μία κλήση στη sleep() μπορεί να επιτρέψει την εκτέλεση νημάτων σε χαμηλότερη προτεραιότητα. Η μέθοδος yield() δίνει την ευκαιρία για εκτέλεση μόνο στα νήματα ίδιας προτεραιότητας. 4

5 13.2 Βασικός έλεγχος νημάτων Τερματισμός ενός νήματος Deprecated Όταν επιστρέφει ένα νήμα από το τέλος μίας μεθόδου run(), αυτό πεθαίνει. Μετά από αυτό δεν μπορεί να ξανα-εκτελεστεί. Ένα νήμα μπορεί να σταματήσει με τη βία δίνοντας την μέθοδο stop(). Αυτή πρέπει να χρησιμοποιηθεί σε συγκεκριμένο στιγμιότυπο της κλάσης Thread για παράδειγμα: public class Xyz implements Runnable { // Διάφορα πράγματα που πρέπει να γίνονται σε ένα νήμα public class ttest { public static void main (String args[]) { Runnable r = new Xyz(); Thread t = new Thread(r); t.start(); // άλλα πράγματα if (time_to_kill) { t.stop(); Μέσα ένα συγκεκριμένο τμήμα κώδικα είναι δυνατό να αποκτήσουμε αναφορά στο τρέχον νήμα χρησιμοποιώντας τη στατική μέθοδο της Thread currentthread(), για παράδειγμα: public class Xyz implements Runnable { public void run() { while (true) { // διάφορα ενδιαφέροντα if (time_to_die) { Thread.currentThread().stop(); Σημειώστε ότι στην περίπτωση αυτή η εκτέλεση της stop() θα καταστρέψει το τρέχον πλαίσιο εκτέλεσης και συνεπώς δε θα εκτελεστεί η συνέχεια του βρόχου run() σε αυτό το πλαίσιο. Η χρήση της Thread.currentThread() δεν περιορίζεται στο παράδειγμα της stop()! Έλεγχος ενός νήματος Ορισμένες φορές είναι δυνατό ένα νήμα να είναι σε άγνωστη κατάσταση (αυτό μπορεί να συμβεί αν ο κώδικάς σας δεν ελέγχει απ ευθείας ένα συγκεκριμένο νήμα). Είναι δυνατό να ρωτήσουμε αν ένα νήμα είναι ακόμα «ζωντανό» χρησιμοποιώντας τη μέθοδο 5

6 isalive(). Το να είναι ένα νήμα «ζωντανό» δε σημαίνει απαραίτητα ότι εκτελείται, μόνο ότι έχει ξεκινήσει και δεν έχει κληθεί για αυτό ποτέ η μέθοδος stop() ούτε έχει φτάσει στο τέλος της μεθόδου run() Βάζοντας τα νήματα σε αναμονή Υπάρχουν αρκετοί μηχανισμοί για να σταματήσουμε προσωρινά την εκτέλεση ενός νήματος. Ακολουθώντας αυτόν τον τύπο απενεργοποίησης η εκτέλεση μπορεί να ξαναξεκινήσει σα να μην είχε συμβεί τίποτα, απλά το νήμα φαίνεται να είχε εκτελέσει μία εντολή πολύ αργά. sleep() Η μέθοδος sleep() παρουσιάστηκε νωρίτερα και χρησιμοποιείται για να σταματήσουμε ένα νήμα για μία χρονική περίοδο. Θυμηθείτε ότι συνήθως το νήμα δε θα ξαναξεκινήσει αμέσως μόλις τελειώσει η περίοδος απενεργοποίησης. Αυτό ισχύει γιατί μπορεί ένα άλλο νήμα να εκτελείται τη χρονική αυτή στιγμή και να μην μπορεί να φύγει από το χρονοπρογραμματισμό εκτός και αν (α) το νήμα που αφυπνίζεται να είναι υψηλότερης προτεραιότητας, (β) το εκτελούμενο νήμα να απενεργοποιηθεί για κάποιον λόγο ή (γ) να είναι ενεργοποιημένος ο χρονοπρογραμματισμός με βάση χρονομερίδια. Στις περισσότερες περιπτώσεις καμία από τις δύο τελευταίες περιπτώσεις δε θα συμβεί άμεσα. suspend() και resume() Deprecated Ορισμένες φορές είναι κατάλληλο να απενεργοποιήσετε την εκτέλεση ενός νήματος επ αόριστον, οπότε κάποιο άλλο νήμα θα πρέπει να είναι υπεύθυνο για να ξεκινήσει ξανά την εκτέλεση. Για το λόγο αυτό χρειαζόμαστε ένα ζεύγος μεθόδων Thread. Ονομάζονται suspend() και resume(). Για παράδειγμα: public class Xyz implements Runnable { public void run() { // διάφορα ενδιαφέροντα // τώρα περίμενε μέχρι να σου πουν να συνεχίσεις Thread.currentThread().suspend(); // κάνε άλλα πράγματα Runnable r = new Xyz(); Thread t = new Thread(r); t.start(); // παύση για λίγο για να εκτελεστεί το Xyz // υπέθεσε ότι έχει φτάσει στο suspend() Thread.sleep(1000); // ξανακάνει το Xyz εκτελέσιμο 6

7 t.resume(); // άφησέ το να εκτελεσθεί Thread.yields(); Σημειώστε ότι εν γένει ένα Thread μπορεί να απενεργοποιηθεί από οποιοδήποτε τμήμα κώδικα που μπορεί να το χειριστεί δηλαδή έχει μία μεταβλητή που αναφέρεται σε αυτό. Σαφώς όμως ένα Thread μπορεί να ξανα-ξεκινήσει μόνο από ένα Thread άλλο από το ίδιο, καθώς το απενεργοποιημένο Thread δεν εκτελεί κανένα κώδικα! join() Η μέθοδος join() προκαλεί το τρέχον νήμα να περιμένει μέχρι να τερματίσει το νήμα στο οποίο κλήθηκε η μέθοδος join. Για παράδειγμα: TimerThread tt = new TimerThread(100); tt.start();... public void timeout() { // Περίμενε να τελειώσει το TimerThread tt.join(); // Τώρα συνέχισε σε αυτό το νήμα... Η join μπορεί να κληθεί επίσης με μία τιμή timeout σε milliseconds: void join(long timeout); όπου η μέθοδος join είτε θα απενεργοποιήσει το τρέχον νήμα για τα timeout milliseconds, είτε θα περιμένει μέχρι να τερματιστεί το νήμα στο οποίο κλήθηκε Άλλοι τρόποι δημιουργίας νημάτων Περιγράψαμε ήδη τη δημιουργία των νημάτων με χρήση μίας ξεχωριστής κλάσης η οποία υλοποιεί το Runnable. Στην πράξη δεν είναι η μόνη πιθανή προσέγγιση. Ο ορισμός της κλάσης Thread δηλώνει ότι στην πράξη υλοποιεί τη διεπαφή Runnable. Είναι δυνατό να δημιουργήσετε ένα Thread δημιουργώντας μία κλάση η οποία κάνει extends την κλάση Thread, αντί να υλοποιήσετε τη Runnable. public class MyThread extends Thread { public void run() { while (running) { // do lots of interesting stuff sleep(100); public static void main(string args[]) { Thread t = new MyThread(); t.start(); 7

8 Εδώ υπάρχει μόνο μία κλάση η MyThread. Όταν δημιουργείται ένα αντικείμενο Thread δεν παρέχονται ορίσματα. Αυτή η μορφή συνάρτησης δημιουργίας δημιουργεί ένα Thread που χρησιμοποιεί τη δική του ενσωματωμένη μέθοδο run() Ποιον τρόπο να χρησιμοποιήσουμε; Δεδομένης της επιλογής ανάμεσα στις δύο προσεγγίσεις πώς θα επιλέξετε ανάμεσά τους; Υπάρχουν σημεία υπέρ κάθε μίας προσέγγισης: Υπέρ της υλοποίησης της Runnable Από απόψεως αντικειμενοστρεφούς σχεδίασης η κλάση Thread είναι αυστηρά μία οριοθέτηση μίας ιδεατής CPU και ως τέτοια θα πρέπει να επεκτείνεται μόνο όταν η συμπεριφορά του μοντέλου της CPU αλλάζει ή επεκτείνεται με κάποιον τρόπο. Συνήθως δεν είναι αυτό εκείνο που θέλουμε να κάνουμε. Εξ αιτίας αυτού, και για να επιτύχουμε τη διάκριση ανάμεσα σε CPU, Κώδικα και Δεδομένα, στο παρόν κεφάλαιο επιλέξαμε την πρώτη προσέγγιση. Εφόσον η Java επιτρέπει μόνο απλή κληρονομικότητα δεν είναι δυνατό να επεκτείνουμε οποιαδήποτε άλλη κλάση, όπως για παράδειγμα την Applet, αν έχουμε ήδη επεκτείνει τη Thread. Σε ορισμένες περιπτώσεις, ο περιορισμός αυτός θα σας αναγκάσει να επιλέξετε την προσέγγιση υλοποίησης της Runnable. Εφόσον ορισμένες φορές αναγκάζεστε να χρησιμοποιήσετε την υλοποίηση της Runnable μπορεί να θέλετε να είστε συνεπής και να το κάνετε πάντα έτσι. Υπέρ της επέκτασης της Thread Όταν η μέθοδος run έχει ενσωματωθεί σε μία κλάση που κάνει extends την κλάση Thread, τότε η αναφορά this στην πράξη αναφέρεται στο πραγματικό στιγμιότυπο της Thread και όχι στον έλεγχο της εκτέλεσης. Εξ αιτίας αυτού δε χρειάζεται να γράφετε πλέον μεγάλες εντολές ελέγχου όπως: Thread.currentThread().start() αλλά αντ αυτής μπορείτε να δώσετε απλά: start(); Επειδή ο κώδικας που προκύπτει είναι λίγο απλούστερος, πολλοί προγραμματιστές Java χρησιμοποιούν το μηχανισμό της επέκτασης της Thread. Προσέξτε όμως ότι ο περιορισμός της απλής κληρονομικότητας στη συνέχεια μπορεί να οδηγήσει στη συνέχεια του κύκλου ζωής του λογισμικού σας σε δυσκολίες Χρήση της synchronized στη Java Εισαγωγή Στο τμήμα αυτό θα συζητήσουμε τη χρήση της δεσμευμένης λέξης synchronized. Αυτή παρέχει στη Java ένα μηχανισμό για να επιτρέπει στους προγραμματιστές να ελέγχουν τα νήματα τα οποία διαμοιράζονται δεδομένα. 8

9 Το πρόβλημα Έστω μία κλάση που αναπαριστά μία στοίβα. Μία πρώτη έκδοσή της μπορεί να είναι η ακόλουθη: class stack { int idx = 0; char [] data = new char[6]; public void push (char c) { data[idx] = c; idx++; public char pop() { idx--; return data[idx]; Σημειώστε ότι η κλάση δεν κάνει καμία προσπάθεια να αντιμετωπίσει υπερχείλιση ή υποχείλιση και ότι η χωρητικότητά της είναι περιορισμένη. Τα ζητήματα αυτά δε θα μας απασχολήσουν στη συζήτησή μας. Παρατηρήστε ότι η συμπεριφορά του μοντέλου αυτού απαιτεί η τιμή του δείκτη να μας δίνει το δείκτη του πίνακα για το επόμενο άδειο κελί στη στοίβα και για το λόγο αυτό υιοθετεί την προσέγγιση «πρώτα μείωση, μετά αύξηση» (predecrement, postincrement). Φανταστείτε τώρα ότι δύο νήματα έχουν αμφότερα μία αναφορά στο ίδιο στιγμιότυπο της κλάσης. Το ένα νήμα τοποθετεί δεδομένα (push) στη στοίβα και το άλλο, λίγο-πολύ ανεξάρτητα, βγάζει (pop) δεδομένα από τη στοίβα. Στη γενική περίπτωση θα φαίνεται ότι τα δεδομένα θα τοποθετούνται και θα αφαιρούνται επιτυχώς. Υπάρχει όμως ένα εν δυνάμει πρόβλημα. Έστω ότι το νήμα «a» προσθέτει και το νήμα «b» αφαιρεί χαρακτήρες. Το νήμα «a» μόλις έχει αφήσει ένα χαρακτήρα, αλλά δεν έχει αυξήσει ακόμα το μετρητή του δείκτη. Για κάποιο λόγο το νήμα προ-εκχωρείται. Στο σημείο αυτό, το μοντέλο δεδομένων που αναπαρίσταται από το αντικείμενό μας είναι ασυνεπές. buffer = p q r idx = 2 ^ Συγκεκριμένα η συνέπεια απαιτεί είτε idx = 3 είτε να μην είχε προστεθεί ο χαρακτήρας. Το νήμα «a» συνεχίζει την εκτέλεσή του και μπορεί να μην υπήρξε πρόβλημα, αλλά έστω ότι και το νήμα «b» περίμενε για να αφαιρέσει ένα χαρακτήρα. Όσο το «a» περίμενε τη σειρά του να εκτελεσθεί, το βήμα «b» έχει την ευκαιρία του να εκτελεσθεί. Μπαίνοντας στη μέθοδο pop() έχουμε μία κατάσταση ασυνεπών δεδομένων. Η μέθοδος pop συνεχίζει και μειώνει την τιμή του δείκτη: buffer = p q r idx = 1 ^ 9

10 Με αυτό ουσιαστικά αγνοεί το χαρακτήρα r. Μετά από αυτό επιστρέφει το χαρακτήρα q. Μέχρι τώρα η συμπεριφορά είναι σα να μην τοποθετήθηκε ποτέ ο χαρακτήρας r, συνεπώς δεν μπορούμε να πούμε ότι υπάρχει κάποιο πρόβλημα. Αλλά ας δούμε τι θα συμβεί όταν επιστρέψει το αρχικό νήμα «a». Το νήμα «a» συνεχίζει από εκεί που έμεινε μέσα στη μέθοδο push(). Συνεχίζει και αυξάνει κατά ένα την τιμή του δείκτη. Τώρα έχουμε buffer = p q r idx = 2 ^ Παρατηρήστε ότι αυτή η διαμόρφωση υπονοεί ότι το q είναι επιτρεπτό και ότι το επόμενο κενό κελί είναι το κελί που περιέχει το r. Με άλλα λόγια, θα διαβάσουμε το q σα να είχε τοποθετηθεί δύο φορές στη στοίβα, αλλά δε θα δούμε ποτέ το r. Αυτό είναι ένα απλό παράδειγμα ενός γενικότερου προβλήματος που μπορεί να προκύψει όταν πολλά νήματα προσπελαύνουν διαμοιραζόμενα δεδομένα. Χρειαζόμαστε ένα μηχανισμό για να βεβαιωθούμε ότι τα δεδομένα μας προστατεύονται από τέτοιου είδους μη ελεγχόμενες προσπελάσεις. Μία προσέγγιση είναι να αποτρέψουμε το νήμα «a» από το να προ-εκχωρηθεί μέχρι να τελειώσει με το κρίσιμο τμήμα του κώδικα. Η προσέγγιση αυτή είναι κοινή στον προγραμματισμό υπολογιστών σε χαμηλό επίπεδο, αλλά εν γένει είναι μη κατάλληλη σε συστήματα με πολλούς χρήστες. Μία άλλη προσέγγιση, αυτή με την οποία λειτουργεί η Java, είναι να παρέχουμε ένα μηχανισμό με βάση τον οποίο τα δεδομένα θα αντιμετωπίζονται ως ευαίσθητα Η ένδειξη κλειδώματος Object Στη Java κάθε στιγμιότυπο οποιουδήποτε αντικειμένου έχει συσχετισμένο με αυτό μία ένδειξη (flag). Η ένδειξη αυτή μπορεί να θεωρηθεί ως μία «ένδειξη κλειδώματος». Για αλληλεπίδραση με την ένδειξη αυτή παρέχεται η δεσμευμένη λέξη synchronized. Δείτε το πιο κάτω τροποποιημένο τμήμα κώδικα: public void push (char c) { synchronized(this) { data[idx] = c; idx++; Όταν το νήμα φτάσει στην εντολή synchronized εξετάζει το αντικείμενο που μεταβιβάζεται ως όρισμα και προσπαθεί να «πάρει» την ένδειξη κλειδώματός του. 10

11 Αντικείμενο this Κώδικας ή συμπεριφορά Νήμα πριν το synchronized(this) public void push (char c) { synchronized(this) { data[idx] = c; idx++; Δεδομένα ή κατάσταση Αντικείμενο this Κώδικας ή συμπεριφορά Νήμα μετά το synchronized(this) public void push (char c) { synchronized(this) { data[idx] = c; idx++; Δεδομένα ή κατάσταση Είναι σημαντικό να κατανοήσουμε ότι από μόνη της η λύση αυτή δεν προστατεύει τα δεδομένα στο αντικείμενο this. Αν κληθεί από άλλο νήμα η μέθοδος pop() χωρίς να τροποποιηθεί συνεχίζει να υπάρχει κίνδυνος να καταστραφεί η συνέπεια του αντικειμένου this. Αυτό που πρέπει να κάνουμε είναι να τροποποιήσουμε και την pop με τον ίδιο τρόπο. Προσθέτουμε μία κλήση στη synchronized(this) γύρω από τα ευαίσθητα τμήματα της κλήσης της pop() ακριβώς παράλληλα με τον τρόπο που το κάναμε για τη μέθοδο push(). Το επόμενο σχήμα δείχνει τι θα συμβεί αν ένα άλλο νήμα προσπαθήσει να εκτελέσει τη μέθοδο ενώ το αρχικό νήμα μας διατηρεί την ένδειξη κλειδώματος. 11

12 Αντικείμενο this Κώδικας ή συμπεριφορά Δεδομένα ή κατάσταση zzz Νήμα πριν το synchronized(this) public char pop () { synchronized(this) { idx--; return data[idx]; Όταν το νήμα προσπαθήσει να εκτελέσει την εντολή synchronized(this) προσπαθεί να πάρει την ένδειξη κλειδώματος του αντικειμένου this. Εφόσον η ένδειξη δεν είναι παρούσα, το νήμα δεν μπορεί να συνεχίσει την εκτέλεσή του. Στην πράξη πηγαίνει σε μία ουρά με νήματα που αναμένουν. Η ουρά αυτή σχετίζεται με την ένδειξη κλειδώματος του αντικειμένου έτσι ώστε όταν η ένδειξη επιστραφεί στο αντικείμενο, το πρώτο νήμα που την ανέμενε να την λάβει και να συνεχίσει να εκτελείται Ελευθέρωση της ένδειξης κλειδώματος Καθώς το νήμα που αναμένει την ένδειξη κλειδώματος ενός αντικειμένου δε θα συνεχίσει να εκτελείται παρά μόνο όταν αυτή επιστραφεί από το νήμα που την κρατά, είναι σαφώς σημαντικό να επιστραφεί η ένδειξη όταν αυτή δε χρειάζεται πλέον. Η ένδειξη κλειδώματος δίνεται στην πράξη πίσω στο αντικείμενο αυτόματα όταν το νήμα που την κρατά περάσει το τέλος του μπλοκ που σχετίζεται με την κλήση synchronized() μέσω της οποία έλαβε την ένδειξη. Η Java δίνει μεγάλη προσοχή ώστε η ένδειξη να επιστρέφει πάντα σωστά, συνεπώς αν ένα συγχρονισμένο μπλοκ παράγει μία εξαίρεση ή αν υπάρχει ένα break σε βρόχο που θα βγει έξω από το μπλοκ, η ένδειξη θα επιστραφεί σωστά. Επίσης, αν ένα νήμα κάνει δύο φορές κλήση synchronized στο ίδιο αντικείμενο, η ένδειξη θα απελευθερωθεί σωστά στην έξοδο από το εξώτερο μπλοκ ενώ το ενδότερο ουσιαστικά αγνοείται. Οι κανόνες αυτοί κάνουν τα συγχρονισμένα μπλοκ πιο απλά στο χειρισμό από ισοδύναμες διευκολύνσεις σε άλλα συστήματα όπως οι δυαδικοί σημαφόροι Βάζοντάς τα όλα μαζί Όπως αναφέραμε και νωρίτερα ο μηχανισμός synchronized() λειτουργεί μόνο αν ο προγραμματιστής τοποθετήσει τις κλήσεις στις σωστές θέσεις. Τώρα θα δούμε πώς να δημιουργήσουμε μία καλά προστατευόμενη κλάση. Θεωρήστε την προσβασιμότητα των στοιχείων δεδομένων που αποτελούν τα ευαίσθητα μέρη του αντικειμένου. Αν αυτά δεν έχουν δηλωθεί ως ιδιωτικά, τότε μπορεί να τα προσπελάσει οποιοσδήποτε εξωτερικός κώδικας. Στην περίπτωση αυτή, βασιζόμαστε ότι ποτέ κανένας προγραμματιστής δε θα παραλείψει τις προστασίες που απαιτούνται. 12

13 Σαφώς αυτή δεν είναι μία ιδιαίτερα ασφαλής στρατηγική. Για το λόγο αυτό τα δεδομένα θα πρέπει να δηλώνονται πάντα ως ιδιωτικά. Εφόσον έχουμε δείξει ότι τα δεδομένα πρέπει, στην πράξη, να είναι σημειωμένα ως ιδιωτικά, το όρισμα στην κλήση synchronized() θα πρέπει να είναι το this. Εξ αιτίας αυτής της γενίκευσης η Java επιτρέπει μία συντομογραφία ώστε αντί να γράφουμε public void push (char c) { synchronized(this) { : : να μπορούμε να γράψουμε public synchronized void push (char c) { : : με το ίδιο αποτέλεσμα. Γιατί θα θέλαμε να επιλέξουμε τη μία αντί της άλλης; Αν χρησιμοποιούμε το synchronized ως τροποποιητή μεθόδου τότε ολόκληρη η μέθοδος γίνεται ένα συγχρονισμένο μπλοκ, πράγμα που μπορεί να έχει ως αποτέλεσμα ότι η ένδειξη κλειδώματος θα κρατηθεί περισσότερο απ όσο αυστηρά χρειάζεται. Αυτό μπορεί να είναι μη αποδοτικό. Από την άλλη, σημειώνοντας έτσι τη μέθοδο επιτρέπουμε στους χρήστες της να γνωρίζουν ότι μέσα σε αυτή υπάρχει συγχρονισμός, κάτι που μπορεί να είναι σημαντικό όταν σχεδιάζουμε ενάντια σε ένα αδιέξοδο, όπως θα δούμε στη συνέχεια. Σημειώστε ότι η γεννήτρια τεκμηρίωσης javadoc θα προωθήσει την ύπαρξη του τροποποιητή synchronized στα αρχεία τεκμηρίωσης, αλλά δε θα τεκμηριώσει τη χρήση του synchronized(this) Αδιέξοδο Σε προγράμματα στα οποία πολλά νήματα ανταγωνίζονται για πρόσβαση σε πολλούς πόρους υπάρχει η πιθανότητα μίας συνθήκης η οποία είναι γνωστή ως αδιέξοδο (deadlock). Αυτό συμβαίνει όταν ένα νήμα αναμένει για μία ένδειξη κλειδώματος που κατέχει ένα άλλο νήμα, αλλά το άλλο νήμα αναμένει για μία ένδειξη κλειδώματος που κατέχει ήδη το πρώτο νήμα. Στην περίπτωση αυτή κανένα από τα δύο δεν μπορεί να συνεχίσει μέχρι το άλλο να έχει περάσει το τέρμα του συγχρονισμένου μπλοκ. Και καθώς κανένα από τα δύο δεν μπορεί να προχωρήσει, κανένα από τα δύο δε θα φτάσει στο τέρμα του μπλοκ. Η Java ούτε ανιχνεύει ούτε προσπαθεί να αποφύγει αυτή τη συνθήκη, είναι συνεπώς ευθύνη του προγραμματιστή να βεβαιωθεί ότι δεν πρόκειται να συμβεί. Ένας πρακτικός κανόνας για αποφυγή αδιεξόδου είναι ο ακόλουθος. Αν υπάρχουν πολλά αντικείμενα στα οποία θέλετε να αποκτήσετε συγχρονισμένη πρόσβαση, πάρτε μία συνολική απόφαση σχετικά με τη σειρά με την οποία θα αποκτάτε τις ενδείξεις κλειδώματος και ακολουθήστε την σε ολόκληρο το πρόγραμμα. 13

14 Μία πιο λεπτομερής συζήτηση του προβλήματος αυτού είναι πέρα από τους σκοπούς του μαθήματος Αλληλεπίδραση νημάτων wait() και notify() Εισαγωγή Συχνά, δημιουργούνται διαφορετικά νήματα ειδικά για να πραγματοποιήσουν εργασίες που δε σχετίζονται μεταξύ τους. Ορισμένες φορές όμως οι εργασίες που πραγματοποιούν τελικά σχετίζονται με κάποιον τρόπο. Όταν συμβαίνει αυτό είναι απαραίτητο να προγραμματίσουμε κάποια αλληλεπίδραση ανάμεσα στα νήματα. Υπάρχουν πρότυποι τρόποι για να το κάνουμε αυτό και δεδομένου ενός μηχανισμού οι υπόλοιποι μπορούν να υλοποιηθούν χρησιμοποιώντας τον. Το τμήμα αυτό εξετάζει το μηχανισμό που παρέχει η Java και περιγράφει τη χρήση του Το πρόβλημα Γιατί λοιπόν να θέλουν δύο νήματα να αλληλεπιδράσουν; Ως απλό παράδειγμα θεωρήστε δύο ανθρώπους, ο ένας πλένει και ο άλλος σκουπίζει πιάτα. Αυτοί οι άνθρωποι αναπαριστούν τα νήματά μας. Ανάμεσά τους βρίσκεται ένα διαμοιραζόμενο αντικείμενο, η στεγνώστρα. Και οι δύο άνθρωποι είναι λίγο τεμπέληδες και θα προτιμούσαν να κάθονται αν δεν έχουν να κάνουν κάτι. Σαφώς αυτός που σκουπίζει δεν μπορεί να ξεκινήσει να σκουπίσει αν δεν υπάρχει τουλάχιστον ένα αντικείμενο στη στεγνώστρα. Επίσης, αν η στεγνώστρα γεμίσει ο πλύστης δεν μπορεί να συνεχίσει μέχρι να υπάρξει χώρος. Θα εισαγάγουμε τώρα το μηχανισμό που παρέχει η Java για την αποδοτική αντιμετώπιση αυτού του προβλήματος Η λύση Θα ήταν δυνατό να προγραμματίσουμε μία λύση σε αυτό το σενάριο χρησιμοποιώντας τις μεθόδους suspend() και resume(). Όμως, μία τέτοια λύση θα απαιτούσε τα δύο νήματα να δημιουργηθούν σε συνεργασία, καθώς κάθε ένα απαιτεί ένα χειριστήριο προς το άλλο. Εξ αιτίας αυτού η Java παρέχει ένα μηχανισμό επικοινωνίας που βασίζεται στα στιγμιότυπα των αντικειμένων. Κάθε στιγμιότυπο αντικειμένων στη Java έχει συσχετισμένες μαζί του δύο ουρές νημάτων. Η πρώτη χρησιμοποιείται από τα νήματα που θέλουν να αποκτήσουν την ένδειξη κλειδώματος και την παρουσιάσαμε νωρίτερα. Η δεύτερη ουρά χρησιμοποιείται για να υλοποιηθούν οι μηχανισμοί επικοινωνίας wait() και notify(). Στη βασική κλάση java.lang.object ορίζονται τρεις μέθοδοι. Αυτές είναι οι wait(), notify() και notifyall(). Θα ασχοληθούμε με τις δύο πρώτες. Ας επιστρέψουμε στο παράδειγμα του πλυσίματος πιάτων. Το νήμα a πλένει και το νήμα b σκουπίζει. Και τα δύο έχουν πρόσβαση στο αντικείμενο της στεγνώστρας. Έστω ότι το νήμα b το νήμα που σκουπίζει θέλει να σκουπίσει ένα αντικείμενο, αλλά η στεγνώστρα είναι άδεια. Αυτό μπορεί να γραφεί ως εξής: if (drainingboard.isempty()) drainingboard.wait(); 14

15 Τώρα όταν το νήμα b κάνει μία κλήση wait(), παύει να είναι εκτελέσιμο, και πηγαίνει στην ουρά αναμονής για το αντικείμενο της στεγνώστρας. Δε θα ξαναεκτελεστεί μέχρι κάτι να το βγάλει από αυτή την ουρά. Πώς λοιπόν θα ξαναξεκινήσει το στέγνωμα. Είναι ευθύνη του νήματος που πλένει να το ενημερώσει ότι υπάρχει κάτι χρήσιμο για να κάνει. Αυτό επιτυγχάνεται καλώντας τη notify() στη στεγνώστρα ως εξής: drainingboard.additem(plate); drainingboard.notify(); Στο σημείο αυτό το πρώτο νήμα που είχε απενεργοποιηθεί στην ουρά αναμονής της στεγνώστρας αφαιρείται από αυτή την ουρά και μπορεί να ανταγωνιστεί για εκτέλεση. Σημειώστε ότι η κλήση notify() γίνεται στην περίπτωση αυτή χωρίς να ελέγξει αν υπάρχουν νήματα που αναμένουν ή όχι. Η προσέγγιση αυτή δημιουργεί σαφώς άχρηστες κλήσεις. Είναι πιθανό να κάνουμε την κλήση μόνο αν το πιάτο που τοποθετήσαμε κάνει τη στεγνώστρα να πάψει να είναι άδεια. Αλλά αυτό είναι μία λεπτομέρεια και μάς απομακρύνει από την ουσία της συζήτησης αυτής. Επιπρόσθετα είναι σημαντικό να κατανοήσουμε ότι αν κληθεί η notify() χωρίς να υπάρχουν απενεργοποιημένα νήματα στην ουρά αναμονής, τότε η κλήση δεν έχει καμία επίπτωση. Οι κλήσεις στη notify() δεν αποθηκεύονται. Επιπρόσθετα θα πρέπει να γνωρίζετε ότι η notify() απελευθερώνει το πολύ το πρώτο νήμα στην ουρά αναμονής. Αν υπήρχαν περισσότερα από ένα μηνύματα που περίμεναν, τα υπόλοιπα συνεχίζουν να παραμένουν στην ουρά. Μπορεί να χρησιμοποιηθεί η μέθοδος notifyall() για να απελευθερωθούν όλα τα νήματα που περιμένουν, εφόσον αυτή είναι η συμπεριφορά που απαιτεί η σχεδίαση του συστήματος. Χρησιμοποιώντας το μηχανισμό αυτό μπορούμε να συντονίσουμε τα νήματα πλυσίματος και στεγνώματος αρκετά απλά, και χωρίς να χρειάζεται να γνωρίζουμε την ταυτότητά τους. Κάθε φορά που πραγματοποιούμε μία πράξη η οποία μάς εγγυάται ότι το άλλο νήμα μπορεί να κάνει κάποια σημαντική δουλειά, κάνουμε μία notify() στο αντικείμενο της στεγνώστρας. Κάθε φορά που προσπαθούμε να κάνουμε μια δουλειά αλλά δεν μπορούμε να συνεχίσουμε γιατί η στεγνώστρα είναι είτε γεμάτη είτε άδεια, κάνουμε wait() στο αντικείμενο της στεγνώστρας Η αλήθεια! Οι μηχανισμοί που περιγράψαμε μέχρι τώρα είναι πολλοί ωραίοι στις αρχές τους, αλλά στη Java η υλοποίηση δεν είναι πάντα τόσο απλή όσο υποθέτουμε. Συγκεκριμένα, η ίδια η ουρά αναμονής είναι μία ευαίσθητη δομή δεδομένων και συνεπώς χρειάζεται να την προστατεύουμε χρησιμοποιώντας το μηχανισμός συγχρονισμού. Δε χρειάζεται να ασχοληθούμε με τη λεπτομέρεια του γιατί αυτό συμβαίνει, αλλά είναι σημαντικό να γνωρίζουμε ότι πριν από κάθε κλήση wait(), notify() και notifyall() σε ένα αντικείμενο, θα πρέπει να κρατάμε την ένδειξη κλειδώματος για το αντικείμενο αυτό. Συγκεκριμένα πρέπει να καλούμε αυτές τις μεθόδους μέσα από ένα μπλοκ synchronized. Συνεπώς πρέπει ο κώδικάς μας να αλλάξει ως εξής: synchronized(drainingboard) { if (drainingboard.isempty()) drainingboard.wait(); 15

16 και με παρόμοιο τρόπο synchronized(drainingboard) { drainingboard.additem(plate); drainingboard.notify(); Μπορείτε αυτό να το εκλάβετε ως έναν απλό κανόνα της γλώσσας, αλλά δημιουργεί μία ενδιαφέρουσα παρατήρηση. Εφόσον γνωρίζουμε ότι η εντολή synchronized απαιτεί από το νήμα να λάβει την ένδειξη κλειδώματος προτού συνεχίσει, θα μπορούσαμε να φανταστούμε ότι μπορεί το νήμα πλυσίματος να μην φτάσει ποτέ την εντολή notify() αν το νήμα στεγνώματος έχει απενεργοποιηθεί σε κατάσταση wait(). Στην πράξη η υλοποίηση είναι τέτοια που αυτό δε συμβαίνει. Συγκεκριμένα, όταν καλούμε τη wait() αυτή πρώτα επιστρέφει στο αντικείμενο την ένδειξη κλειδώματος του αντικειμένου. Όμως για να αποφύγουμε την πιθανότητα κάποιας καταστροφής, όταν ένα νήμα δεχτεί τη notify() δε γίνεται αμέσως εκτελέσιμο, αλλά τοποθετείτε στην ουρά της ένδειξης κλειδώματος. Έτσι δεν μπορεί να συνεχίσει στην πράξη, αν δεν ξαναπάρει την ένδειξη κλειδώματος. Μία άλλη άποψη της πραγματικής υλοποίησης είναι ότι η μέθοδος wait() μπορεί να τερματιστεί είτε από μία notify() είτε καλώντας τη μέθοδο interrupt() της Thread. Στην περίπτωση αυτή, η wait() «πετάει» μία InterruptedException, η οποία συνήθως απαιτεί να τοποθετηθεί η wait() μέσα σε μία δομή try/catch Βάζοντάς τα όλα μαζί Ας προσπαθήσουμε τώρα να φτιάξουμε ένα πραγματικό παράδειγμα από όλα αυτά. Θα δουλέψουμε με τη βασική αρχή του πλυσίματος και του στεγνώματος, αλλά αντί για πιάτα στη στεγνώστρα θα μεταβιβάζουμε χαρακτήρες μέσω ενός αντικειμένου στοίβας. Στην επιστήμη των υπολογιστών αυτό είναι ένα κλασικό παράδειγμα του προβλήματος παραγωγών-καταναλωτών (producer-consumer problem). Θα ξεκινήσουμε βλέποντας τη μορφή του αντικειμένου της στοίβας, στη συνέχεια θα εξετάσουμε τις λεπτομέρειες των νημάτων που θα παράγουν και θα καταναλώνουν. Τέλος, θα δούμε τις λεπτομέρειες της στοίβας και τους μηχανισμούς που χρησιμοποιούνται για να την προστατέψουμε και να υλοποιήσουμε την επικοινωνία ανάμεσα στα νήματα. Η κλάση στοίβας, που θα ονομάζεται SyncStack για να τη διακρίνουμε από τη βασική κλάση java.util.stack, θα παρέχει την πιο κάτω δημόσια διεπαφή API: public void push(char c); public char pop(); Παραγωγός Το νήμα του παραγωγού θα εκτελεί την πιο κάτω μέθοδο public void run() { char c; for (int i = 0; i < 20; i++) { c = (char) (Math.random() * 26 + A ); thestack.push ; 16

17 System.out.println( Produced: + c); try { Thread.sleep((int)(Math.random() * 100)); catch (InterruptedException e) { // αγνοήστε την Αυτή θα παράγει 20 τυχαία κεφαλαία λατινικά γράμματα και θα τα κάνει push σε μία στοίβα με τυχαία καθυστέρηση ανάμεσα σε κάθε τοποθέτηση. Η καθυστέρηση θα είναι μεταξύ 0 και 100 milliseconds. Κάθε χαρακτήρας που θα τοποθετείτε θα αναφέρεται στην κονσόλα Καταναλωτής Το νήμα του καταναλωτή θα εκτελεί την πιο κάτω μέθοδο: public void run() { char c; for (int i = 0; i < 20; i++) { c = thestack.pop(); System.out.println( Consumed: + c); try { Thread.sleep((int) (Math.random() * 1000)); catch (InterruptedException e) { // αγνοήστε την Αυτή θα συλλέξει 20 χαρακτήρες από τη στοίβα, με καθυστέρηση ανάμεσα σε κάθε προσπάθεια. Η καθυστέρηση θα είναι μεταξύ 0 και 2 δευτερολέπτων. Αυτό σημαίνει ότι η στοίβα θα αδειάζει πιο γρήγορα απ ό,τι θα γεμίζει και συνεπώς θα γεμίσει πλήρως πολύ σύντομα. Ας δούμε τώρα τη δόμηση της κλάσης της στοίβας. Χρειαζόμαστε ένα δείκτη (index) και ένα πίνακα ως ενδιάμεση μνήμη (buffer array). Η ενδιάμεση μνήμη δε θα πρέπει να είναι πολύ μεγάλη, καθώς σκοπός της άσκησης είναι να δείξουμε ότι υπάρχει ορθή λειτουργία και συγχρονισμός όταν γεμίζει. Στην περίπτωση αυτή ο πίνακας θα είναι 6 χαρακτήρων Η κλάση SyncStack Μία στιγμιότυπο της SyncStack που μόλις έχει φτιαχτεί θα πρέπει να είναι κενό, κάτι που μπορεί να επιτευχθεί εύκολα χρησιμοποιώντας την εξ ορισμού αρχικοποίηση των τιμών, αλλά για λόγους σωστής τακτικής θα παρουσιάσουμε τη διαδικασία αυτή ρητά. Συνεπώς ξεκινάμε να φτιάχνουμε την κλάση μας. class SyncStack { private int index = 0; private char [] buffer = new char[6]; 17

18 public synchronized char pop() { public synchronized void push(char c) { Παρατηρήστε την έλλειψη συναρτήσεων δημιουργίας. Θα ήταν ίσως καλύτερο για λόγους στυλ να τις παρουσιάσουμε, αλλά για λόγους συντομίας τις παραλείψαμε. Ας δούμε τώρα τις μεθόδους push και pop. Θα χρειαστεί να τις κάνουμε synchronized, για να προστατέψουμε τα ευαίσθητα στοιχεία δεδομένων index και buffer. Επιπρόσθετα, χρειάζεται να φροντίσουμε να γίνεται wait() αν η μέθοδος δεν μπορεί να συνεχίσει, και notify() όταν κάνουμε τη δουλειά μας. Η μέθοδος pop() είναι έτσι: public synchronized void push(char c) { while (index == buffer.length) { try { this.wait(); catch (InterruptedException e) { // αγνόησε το this.notify(); buffer[index] = c; index++; Παρατηρήστε ότι η κλήση στη wait() έγινε ρητά από ως this.wait(). Η χρήση του this είναι πλεονάζουσα, αλλά έχει συμπληρωθεί για να δοθεί έμφαση στο ότι το ραντεβού (rendezvous) γίνεται στο συγκεκριμένο (this) αντικείμενο στοίβας. Η κλήση wait() τοποθετείται σε μία δομή try/catch. Εξ αιτίας της δυνατότητας η wait() να βγει εξ αιτίας μίας interrupt() πρέπει να έχουμε επανάληψη στον έλεγχο για την περίπτωση που το Thread «ξύπνησε» από τη wait() πρόωρα. Έστω η κλήση στη notify(). Και πάλι έχουμε μία ρητή this.notify(), που είναι πλεονάζουσα, αλλά περιγραφική. Τι γίνεται με το σημείο που καλείται η notify(). Γίνεται προτού γίνει η αλλαγή, και γιατί δεν είναι λάθος; Η απάντηση είναι ότι οποιοδήποτε νήμα είχε σταματήσει εξ αιτίας του wait() δεν μπορεί να συνεχίσει προτού να βγούμε από το συγχρονισμένο μπλοκ, συνεπώς μπορούμε να δώσουμε τη notify() όποτε θέλουμε, αφού γνωρίζουμε ότι πρόκειται να συνεχίσουμε με τις αναγκαίες αλλαγές. Το τελικό σημείο είναι το ζήτημα του ελέγχου για λάθη. Μπορεί να παρατηρήσετε ότι δεν υπάρχει ρητός κώδικας για να αποτραπεί η κατάσταση υπερχείλισης. Αυτή δεν είναι απαραίτητη καθώς ο μόνος τρόπος για να προσθέσουμε κάτι στη στοίβα είναι μέσω αυτής της μεθόδου, και η μέθοδος αυτή θα μπει μέσα στο βρόχο του wait() αν κληθεί σε τέτοιες συνθήκες ώστε να προκαλέσει υπερχείλιση. Συνεπώς ο έλεγχος για λάθη δεν είναι απαραίτητος. Μπορούμε να είμαστε σίγουροι για αυτό σε ένα εκτελούμενο σύστημα για περισσότερους του ενός λόγους. Αν η λογική μας προκύψει ότι είναι προβληματική, θα έχουμε κάνει μία προσπέλαση πέρα από τα όρια του πίνακα, πράγμα που θα προκαλέσει άμεσα μία Exception, συνεπώς δεν υπάρχει πιθανότητα να μην παρατηρήσετε αυτό το 18

19 λάθος. Σε άλλες περιπτώσεις μπορείτε να χρησιμοποιήσετε εξαιρέσεις κατά το χρόνο εκτέλεσης για να τοποθετήσετε τους ελέγχους σας. public synchronized char pop() { while (index == 0) { try { this.wait(); catch (InterruptedException e) { // αγνοήστε την this.notify(); index--; return buffer[index]; Το μόνο που απομένει είναι να τοποθετήσουμε τα κομμάτια αυτά σε πλήρεις κλάσεις και να δώσουμε και τα στοιχεία για να τα βάλουμε να τρέξουν όλα μαζί. Ακολουθεί ο τελικός κώδικας. SyncTest.java package mod13; public class SyncTest { public static void main (String args[]) { SyncStack stack = new SyncStack(); Runnable source = new Producer(stack); Runnable sink = new Consumer(stack); Thread t1 = new Thread(source); Thread t2 = new Thread(sink); t1.start(); t2.start(); Producer.java package mod13; public class Producer implements Runnable { SyncStack thestack; public Producer(SyncStack a) { thestack = a; public void run() { char c; for (int i = 0; i < 20; i++) { c = (char) (Math.random() * 26 + A ); 19

20 thestack.push ; System.out.println( Produced: + c); try { Thread.sleep((int)(Math.random() * 100)); catch (InterruptedException e) { // αγνοήστε την Consumer.java package mod13; public class Consumer implements Runnable { SyncStack thestack; public Consumer (SyncStack a) { thestack = a; public void run() { char c; for (int i = 0; i < 20; i++) { c = thestack.pop(); System.out.println( Consumed: + c); try { Thread.sleep((int) (Math.random() * 1000)); catch (InterruptedException e) { // αγνοήστε την SyncStack.java package mod13; class SyncStack { private int index = 0; private char [] buffer = new char[6]; public synchronized char pop() { while (index == 0) { try { this.wait(); catch (InterruptedException e) { 20

21 // αγνοήστε την this.notify(); index--; return buffer[index]; public synchronized void push(char c) { while (index == buffer.length) { try { this.wait(); catch (InterruptedException e) { // αγνόησε το this.notify(); buffer[index] = c; index++; 13.7 Εργασίες Επιπέδου 1: Τρία νήματα 1. Γράψτε ένα απλό πρόγραμμα που δημιουργεί τρία νήματα: κάθε ένα θα πρέπει να παρουσιάζει την ώρα που εκτελέστηκε (μπορείτε να χρησιμοποιήσετε την κλάση Date()). 21

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

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

Διαβάστε περισσότερα

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

Οντοκεντρικός Προγραμματισμός Οντοκεντρικός Προγραμματισμός Ενότητα 3: JAVA: ΕΞΑΙΡΕΣΕΙΣ, ΕΙΣΟΔΟΣ-ΕΞΟΔΟΣ, ΝΗΜΑΤΑ Νήματα ΔΙΔΑΣΚΟΝΤΕΣ: Ιωάννης Χατζηλυγερούδης, Χρήστος Μακρής Πολυτεχνική Σχολή Τμήμα Μηχανικών Η/Υ & Πληροφορικής ΝΗΜΑΤΑ

Διαβάστε περισσότερα

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

Τ.Ε.Ι. Μεσολογγίου, Τµήµα τηλεπικοινωνιακών Συστημάτων & Δικτύων Εργαστήριο Java Lab09 Αντικείμενο: Πολυνηματικές εφαρμογές Η χρήση περισσότερων από μιας ροής εντολών μέσα σε ένα πρόγραμμα είναι γνωστή ως multithreading. H κάθε μια ροή εντολών μέσα στο πρόγραμμα ονομάζεται

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

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

Το παρακάτω πρόγραμμα ορίζει δυο κλάσεις την SimpleThread και την TwoThreadsTest: Εισαγωγή στη γλώσσα προγραμματισμού Java 41 6. Threads Πολλές γλώσσες προγαμματισμού όπως και η Java διαθέτουν εργαλεία για την υλοποίηση threads στα προγράμματά τους. Αυτές οι γλώσσες καλούνται multithreading

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

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

Προγραμματισμός ΙΙ (Java) 10. Πολυνηματικές εφαρμογές Προγραμματισμός ΙΙ (Java) 10. Πολυνηματικές εφαρμογές Multithreading Μulti-processing Πολλές διεργασίες ταυτόχρονα Κάθε διεργασία έχει το δικό της χώρο μνήμης ή ενδέχεται όλες να μοιράζονται και κάποιο

Διαβάστε περισσότερα

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

Κατανεμημένα Συστήματα Κατανεμημένα Συστήματα Σημειώσεις εργαστηρίου Lab#7 - Διεργασίες, Nήματα, Πολυνημάτωση στη Python Νεβράντζας Βάιος-Γερμανός Λάρισα, Φεβρουάριος 2013 Lab#7 - Διεργασιές, Νη ματα, Πολυνημα τωση στη Python,

Διαβάστε περισσότερα

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

Αντικειμενοστρεφής Προγραμματισμός ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΙΚΑ ΜΑΘΗΜΑΤΑ Αντικειμενοστρεφής Προγραμματισμός Ενότητα 13: Ταυτόχρονος Προγραμματισμός Γρηγόρης Τσουμάκας, Επικ. Καθηγητής Άδειες Χρήσης Το παρόν

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας Στην άσκηση αυτή θα υλοποιήσετε μια κλάση Geometric η οποία διαχειρίζεται μια γεωμετρική ακολουθία ακεραίων

Διαβάστε περισσότερα

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

2.1 Αντικειµενοστρεφής προγραµµατισµός 2.1 Αντικειµενοστρεφής προγραµµατισµός Στον αντικειµενοστρεφή προγραµµατισµό (object oriented programming, OOP) ένα πρόγραµµα υπολογιστή είναι ένα σύνολο αλληλεπιδρώντων αντικειµένων. Μπορεί να ειπωθεί

Διαβάστε περισσότερα

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

6. Εξαιρέσεις στη γλώσσα Java 6. Εξαιρέσεις στη γλώσσα Java Με το τέλος αυτού του κεφαλαίου θα μπορείτε: Να ορίζετε εξαιρέσεις Να εξηγείτε γιατί είναι σημαντικός ο χειρισμός των εξαιρέσεων Να γράφετε κώδικα για να συλλαμβάνετε εξαιρέσεις

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κλάσεις και Αντικείμενα Αναφορές Μαθήματα από το lab Υπενθύμιση: Η άσκηση ζητούσε να υλοποιήσετε μία κλάση vector που να διαχειρίζεται διανύσματα οποιουδήποτε

Διαβάστε περισσότερα

2 Ορισμός Κλάσεων. Παράδειγμα: Μηχανή για Εισιτήρια. Δομή μιας Κλάσης. Ο Σκελετός της Κλάσης για τη Μηχανή. Ορισμός Πεδίων 4/3/2008

2 Ορισμός Κλάσεων. Παράδειγμα: Μηχανή για Εισιτήρια. Δομή μιας Κλάσης. Ο Σκελετός της Κλάσης για τη Μηχανή. Ορισμός Πεδίων 4/3/2008 Παράδειγμα: Μηχανή για Εισιτήρια 2 Ορισμός Κλάσεων Σύνταξη κλάσης: πεδία, κατασκευαστές, μέθοδοι Ένας αυτόματος εκδότης εισιτηρίων είναι μια μηχανή που δέχεται χρήματα και εκδίδει ένα εισιτήριο. Εκδίδει

Διαβάστε περισσότερα

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

Κλάσεις και Αντικείµενα Κλάσεις και Αντικείµενα Γρηγόρης Τσουµάκας Τµήµα Πληροφορικής, Αριστοτέλειο Πανεπιστήµιο Θεσσαλονίκης Κλάσεις και Αντικείµενα 2 Τα αντικείµενα σε µια αντικειµενοστρεφή γλώσσα προγραµµατισµού, µοντελοποιούν

Διαβάστε περισσότερα

1. Ξεκινώντας. 1.1 Τι είναι η Java. PDF created with FinePrint pdffactory Pro trial version

1. Ξεκινώντας. 1.1 Τι είναι η Java. PDF created with FinePrint pdffactory Pro trial version 1. Ξεκινώντας Τελειώνοντας αυτό το κεφάλαιο θα μπορείτε: Να περιγράψετε τα κύρια χαρακτηριστικά της γλώσσας Java Να περιγράψετε τη Java Virtual Machine Να περιγράψετε πώς λειτουργεί ο μηχανισμός «συλλογής

Διαβάστε περισσότερα

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

Ειδικά Θέματα Προγραμματισμού Ειδικά Θέματα Προγραμματισμού Ενότητα 6: Threads Μιχάλας Άγγελος Τμήμα Μηχανικών Πληροφορικής ΤΕ Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό

Διαβάστε περισσότερα

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Constructors, equals, tostring ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κλάσεις και Αντικείμενα Constructors, equals, tostring Constructors (Δημιουργοί) O Constructor είναι μια «μέθοδος» η οποία καλείται όταν δημιουργούμε το αντικείμενο

Διαβάστε περισσότερα

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

Εισαγωγή στην Java. Module 9: Threads. Prepared by Chris Panayiotou for EPL /03/2004 Εισαγωγή στην Java Module 9: Threads 15/03/2004 Prepared by Chris Panayiotou for EPL 602 1 Εισαγωγή στα Threads Συχνά χρειάζεται, να υπάρχουν ανεξάρτητες διεργασίες σε ένα πρόγραµµα separate, independently-running

Διαβάστε περισσότερα

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

Κλάσεις στη Java. Παύλος Εφραιμίδης. Java Κλάσεις στη Java 1 Κλάσεις στη Java Παύλος Εφραιμίδης Java Κλάσεις στη Java 1 Κλάσεις στην Java Θα δούμε τη διαδικασία δημιουργίας μιας κλάσης Θα υλοποιήσουμε μια κλάση για τη Δομή Δεδομένων Stack Java Κλάσεις στη Java 2

Διαβάστε περισσότερα

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

Εργαστήριο 1-1 η Άσκηση - Ανάλυση Εργαστήριο 1-1 η Άσκηση - Ανάλυση Εκφώνηση: Δημιουργείστε εφαρμογή σε Java Swing με χρήση του IDE NetBeans όπου θα παρουσιάζεται ποιο κουμπί πατήθηκε. Η εφαρμογή θα μοιάζει ως εξής: Πρώτο Βήμα: Αρχική

Διαβάστε περισσότερα

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

Γενικά (για τις γραπτές εξετάσεις) Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Διάλεξη #12 η : Επανάληψη Γαβαλάς Δαμιανός dgavalas@aegean.gr Γενικά (για τις γραπτές εξετάσεις) Δεν υπάρχει αυστηρά ορισμένη «ύλη εξετάσεων» (καθώς δεν έχετε

Διαβάστε περισσότερα

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

Κλάσεις στη Java. Στοίβα - Stack. Δήλωση της κλάσης. ΗκλάσηVector της Java. Ηκλάση Stack Κλάσεις στην Java Κλάσεις στη Java Παύλος Εφραιμίδης Θα δούμε τη διαδικασία δημιουργίας μιας κλάσης Θα υλοποιήσουμε μια κλάση για τη Δομή Δεδομένων Stack Java Κλάσεις στη Java 1 Java Κλάσεις στη Java 2

Διαβάστε περισσότερα

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κλάσεις και Αντικείμενα Στην άσκηση αυτή θα υλοποιήσετε μια κλάση RandomVector η οποία διαχειρίζεται ένα τυχαίο διάνυσμα ακεραίων το οποίο μπορεί να έχει οποιοδήποτε

Διαβάστε περισσότερα

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

3 Αλληλεπίδραση Αντικειμένων Αφαίρεση και Αρθρωσιμότητα 3 Αλληλεπίδραση Αντικειμένων Πώς συνεργάζονται τα αντικείμενα που δημιουργούμε Αφαίρεση (abstraction) είναι η δυνατότητα να αγνοούμε τις λεπτομέρειες και να εστιάζουμε την προσοχή

Διαβάστε περισσότερα

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Μνήμης Αντικείμενα ως ορίσματα ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Αναφορές Στοίβα και Σωρός Μνήμης Αντικείμενα ως ορίσματα ΑΝΑΦΟΡΕΣ new Όπως είδαμε για να δημιουργήσουμε ένα αντικείμενο χρειάζεται να καλέσουμε τη new. Για

Διαβάστε περισσότερα

Dr. Garmpis Aristogiannis - EPDO TEI Messolonghi

Dr. Garmpis Aristogiannis - EPDO TEI Messolonghi Προϋποθέσεις για Αµοιβαίο Αποκλεισµό Μόνο µία διεργασία σε κρίσιµο τµήµασεκοινό πόρο Μία διεργασία που σταµατά σε µη κρίσιµο σηµείο δεν πρέπει να επιρεάζει τις υπόλοιπες διεργασίες εν πρέπει να υπάρχει

Διαβάστε περισσότερα

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

14. Δικτύωση με Java Δικτύωση με Java Sockets Δημιουργία της σύνδεσης Διευθυνσιοδότηση της σύνδεσης 14. Δικτύωση με Java Τελειώνοντας αυτό το κεφάλαιο θα μπορείτε: Να δημιουργείτε έναν ελάχιστο εξυπηρέτη TCP/IP σε Java Να δημιουργείτε έναν ελάχιστο εξυπηρετούμενο TCP/IP σε Java Να κατανοείτε πώς υλοποιούνται

Διαβάστε περισσότερα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Μαθήματα από τα εργαστήρια

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Μαθήματα από τα εργαστήρια ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Μαθήματα από τα εργαστήρια ΕΡΓΑΣΤΗΡΙΟ 1 Μαθήματα από το πρώτο εργαστήριο Δημιουργία αντικειμένου Scanner Scanner input = new Scanner(System.in); Το αντικείμενο

Διαβάστε περισσότερα

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

Περιεχόµενα. 1 Εισαγωγή στις οµές εδοµένων 3. 2 Στοίβα (Stack) 5 Περιεχόµενα 1 Εισαγωγή στις οµές εδοµένων 3 2 Στοίβα (Stack) 5 i ΠΕΡΙΕΧΟΜΕΝΑ ΠΕΡΙΕΧΟΜΕΝΑ ii Πληροφορίες Εργαστηρίου Σκοπός του εργαστηρίου Το εργαστήριο οµές εδοµένων αποσκοπεί στην εφαρµογή των τεχνολογιών

Διαβάστε περισσότερα

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργώντας δικές μας Κλάσεις και Αντικείμενα ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Δημιουργώντας δικές μας Κλάσεις και Αντικείμενα Μαθήματα από το πρώτο εργαστήριο Δημιουργία αντικειμένου Scanner Scanner input = new Scanner(System.in); Το

Διαβάστε περισσότερα

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

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 9 : ΕΞΑΙΡΕΣΕΙΣ ΚΑΙ Ο ΧΕΙΡΙΣΜΟΣ ΤΟΥΣ Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 9 : ΕΞΑΙΡΕΣΕΙΣ ΚΑΙ Ο ΧΕΙΡΙΣΜΟΣ ΤΟΥΣ EXCEPTIONS & EXCEPTION HANDLING Εξαιρέσεις (Exceptions) Γνωμικό της Μηχανικής Λογισμικού: το 80% της δουλειάς των μηχανικών

Διαβάστε περισσότερα

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

HelloWorld. Παύλος Εφραιμίδης. Java Το πρόγραμμα HelloWorld 1 HelloWorld Παύλος Εφραιμίδης Java Το πρόγραμμα HelloWorld 1 Το πρόγραμμα HelloWorld.java Σχόλια στη Java /** * The HelloWorld class */ class HelloWorld { public static void main(string[] args) { System.out.println("Hello

Διαβάστε περισσότερα

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

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος 2011-2012. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Προγραμματισμός Ι Δυναμική Διαχείριση Μνήμης Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ακ. Έτος 2011-2012 Ανάγκη για Δυναμική Μνήμη Στατική Μνήμη Μέχρι τώρα χρησιμοποιούσαμε

Διαβάστε περισσότερα

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

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 6/12/07 Πρώτοι αριθμοί ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 6/12/07 Ένας ακέραιος μεγαλύτερος του 1 είναι πρώτος αν έχει ακριβώς δύο διαιρέτες (τη μονάδα και τον εαυτό του). Πρόβλημα: έλεγχος

Διαβάστε περισσότερα

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας Ένα ιστόγραμμα τιμών μετράει για ένα σύνολο από τιμές πόσες φορές εμφανίστηκε η κάθε τιμή. Για παράδειγμα

Διαβάστε περισσότερα

Οι δομές δεδομένων στοίβα και ουρά

Οι δομές δεδομένων στοίβα και ουρά Καθηγητής Πληροφορικής Απαγορεύεται η αναπαραγωγή των σημειώσεων χωρίς αναφορά στην πηγή Βίντεο: https://youtu.be/j8petzztqty Οι δομές δεδομένων στοίβα και ουρά Εισαγωγή Στα πλαίσια του μαθήματος της Ανάπτυξης

Διαβάστε περισσότερα

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κλάσεις και Αντικείμενα Μέθοδοι Παράδειγμα 1 Θέλουμε ένα πρόγραμμα που να προσομοιώνει την κίνηση ενός αυτοκινήτου, το οποίο κινείται και τυπώνει τη θέση του.

Διαβάστε περισσότερα

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Αντικείμενα ως ορίσματα ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Αναφορές Αντικείμενα ως ορίσματα Η μνήμη του υπολογιστή Η κύρια μνήμη (main memory - RAM) του υπολογιστή κρατάει τα δεδομένα για την εκτέλεση των προγραμμάτων.

Διαβάστε περισσότερα

Λύβας Χρήστος Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος

Λύβας Χρήστος Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ IΙ Λύβας Χρήστος chrislibas@ssl-unipi.gr Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος >_ ΣΥΝΑΡΤΗΣΕΙΣ ΣΤΗ C (1/3) +- Στη C χρησιμοποιούμε συχνα τις συναρτήσεις (functions),

Διαβάστε περισσότερα

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

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 11/3/2008 ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 11/3/2008 Κατασκευαστές (Constructors) Ειδικός τύπος μεθόδων, οι οποίες: - είναι public και έχουν το ίδιο όνομα με αυτό της κλάσης - χρησιμοποιούνται για να αρχικοποιήσουν κάποιες

Διαβάστε περισσότερα

Συλλογές, Στοίβες και Ουρές

Συλλογές, Στοίβες και Ουρές Συλλογές, Στοίβες και Ουρές Σε πολλές εφαρμογές μας αρκεί η αναπαράσταση ενός δυναμικού συνόλου με μια δομή δεδομένων η οποία δεν υποστηρίζει την αναζήτηση οποιουδήποτε στοιχείου. Συλλογή (bag) : Επιστρέφει

Διαβάστε περισσότερα

public void printstatement() { System.out.println("Employee: " + name + " with salary: " + salary);

public void printstatement() { System.out.println(Employee:  + name +  with salary:  + salary); Κληρονομικότητα Η κληρονομικότητα (inheritance) αποτελεί έναν από τους χαρακτηριστικότερους μηχανισμούς των αντικειμενοστρεφών γλωσσών προγραμματισμού. Επιτρέπει την δημιουργία μιας νέας κλάσης απορροφώντας

Διαβάστε περισσότερα

Αντικειμενοστραφής Προγραμματισμός I(5 ο εξ) Εργαστήριο #4 ο : Αποσφαλμάτωση (debugging), μετατροπές

Αντικειμενοστραφής Προγραμματισμός I(5 ο εξ) Εργαστήριο #4 ο : Αποσφαλμάτωση (debugging), μετατροπές Αντικειμενοστραφής Προγραμματισμός I(5 ο εξ) Εργαστήριο #4 ο : Αποσφαλμάτωση (debugging), μετατροπές τύπων, δημιουργία τυχαίων αριθμών, λήψη εισόδου από χρήστη Λογικά λάθη public class ShowLogicErrors

Διαβάστε περισσότερα

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Εισαγωγή στη Java Είσοδος Χρησιμοποιούμε την κλάση Scanner της Java import java.util.scanner; Αρχικοποιείται με το ρεύμα εισόδου: Scanner in = new Scanner(System.in);

Διαβάστε περισσότερα

Κρίσιμη Περιοχή Υπό Συνθήκη (Conditional Critical Regions) Ταυτόχρονος Προγραμματισμός 1

Κρίσιμη Περιοχή Υπό Συνθήκη (Conditional Critical Regions) Ταυτόχρονος Προγραμματισμός 1 Κρίσιμη Περιοχή Υπό Συνθήκη (onditional ritical Regions) Ταυτόχρονος Προγραμματισμός 1 lalis@inf.uth.gr Πέρα από ελεγκτές Ο ελεγκτής είναι χρήσιμο εργαλείο συγχρονισμού παρέχει στον προγραμματιστή εγγυημένο

Διαβάστε περισσότερα

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java II ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Εισαγωγή στη Java II Strings Η κλάση String είναι προκαθορισμένη κλάση της Java που μας επιτρέπει να χειριζόμαστε αλφαριθμητικά. Ο τελεστής + μας επιτρέπει

Διαβάστε περισσότερα

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

Παράλληλη Επεξεργασία Παράλληλη Επεξεργασία Φροντιστήριο: Εισαγωγή στα Πολυεπεξεργαστικά Συστήματα Διερασίες και Νήματα σε Πολυεπεξεργαστικά Συστήματα Εργαστήριο Πληροφοριακών Συστημάτων Υψηλής Επίδοσης Parallel and Distributed

Διαβάστε περισσότερα

Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Εργαστήριο #4 ο : Αποσφαλμάτωση (debugging), μετατροπές

Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Εργαστήριο #4 ο : Αποσφαλμάτωση (debugging), μετατροπές Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Εργαστήριο #4 ο : Αποσφαλμάτωση (debugging), μετατροπές τύπων, δημιουργία τυχαίων αριθμών, λήψη εισόδου από χρήστη Γαβαλάς Δαμιανός dgavalas@aegean.gr Λογικά

Διαβάστε περισσότερα

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

Δομημένος Προγραμματισμός ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα Δομημένος Προγραμματισμός Ενότητα: Συναρτήσεις θεωρία Δ. Ε. Μετάφας Τμ. Ηλεκτρονικών Μηχ. Τ.Ε. Άδειες Χρήσης Το παρόν εκπαιδευτικό

Διαβάστε περισσότερα

Τι χρειάζεται ένας φοιτητής για τη σωστή παρακολούθηση και συμμετοχή στο μαθημα;

Τι χρειάζεται ένας φοιτητής για τη σωστή παρακολούθηση και συμμετοχή στο μαθημα; Εισαγωγή Τι χρειάζεται ένας φοιτητής για τη σωστή παρακολούθηση και συμμετοχή στο μαθημα; 1. Σελίδα μαθήματος Εγγραφή Ο κάθε φοιτητής πρέπει να κάνει εγγραφή στη σελίδα του μαθήματος στην πλατφόρμα e-class

Διαβάστε περισσότερα

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

Αντικειμενοστρεφής Προγραμματισμός Αντικειμενοστρεφής Προγραμματισμός Διδάσκουσα: Αναπλ. Καθηγήτρια Ανδριάνα Πρέντζα aprentza@unipi.gr Εργαστηριακός Συνεργάτης: Δρ. Βασιλική Κούφη vassok@unipi.gr Εργαστήριο 2 Βασικοί Τύποι Μεταβλητών Java

Διαβάστε περισσότερα

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

Προγραμματισμός ΙΙ (Java) 10. Πολυνηματικές εφαρμογές Τεκμηρίωση κώδικα Προγραμματισμός ΙΙ (Java) 10. Πολυνηματικές εφαρμογές Τεκμηρίωση κώδικα Multithreading Μulti-processing Πολλές διεργασίες ταυτόχρονα Κάθε διεργασία έχει το δικό της χώρο μνήμης ή ενδέχεται όλες να μοιράζονται

Διαβάστε περισσότερα

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

Εισαγωγή στην Πληροφορική Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ιονίων Νήσων Εισαγωγή στην Πληροφορική Ενότητα 8: Λειτουργικά Συστήματα Το περιεχόμενο του μαθήματος διατίθεται με άδεια Creative Commons εκτός και αν αναφέρεται διαφορετικά

Διαβάστε περισσότερα

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

Προγραμματισμός Ι (ΗΥ120) Προγραμματισμός Ι (ΗΥ120) Διάλεξη 9: Συναρτήσεις Ορισμός συναρτήσεων () { /* δήλωση μεταβλητών */ /* εντολές ελέγχου/επεξεργασίας */ o Μια συνάρτηση ορίζεται δίνοντας

Διαβάστε περισσότερα

ΕΡΓΑΣΤΗΡΙΟ 16. Χρησιμοποιώντας τον Αποσφαλματιστή (Debugger) του Eclipse

ΕΡΓΑΣΤΗΡΙΟ 16. Χρησιμοποιώντας τον Αποσφαλματιστή (Debugger) του Eclipse ΕΡΓΑΣΤΗΡΙΟ 16 Χρησιμοποιώντας τον Αποσφαλματιστή (Debugger) του Eclipse 1. Δημιουργήστε ένα νέο project και ενσωματώστε το πρόγραμμα Fibonacci.java. 2. Βεβαιωθείτε ότι μεταγλωττίζει σωστά. Σχήμα 1: Adding

Διαβάστε περισσότερα

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Πίνακες Κλάσεις και Αντικείμενα Μαθήματα από το πρώτο εργαστήριο Δημιουργία αντικειμένου Scanner Scanner input = new Scanner(System.in); Το αντικείμενο input

Διαβάστε περισσότερα

2.1. Εντολές. 2.2. Σχόλια. 2.3. Τύποι Δεδομένων

2.1. Εντολές. 2.2. Σχόλια. 2.3. Τύποι Δεδομένων 2 Βασικές Εντολές 2.1. Εντολές Οι στην Java ακολουθούν το πρότυπο της γλώσσας C. Έτσι, κάθε εντολή που γράφουμε στη Java θα πρέπει να τελειώνει με το ερωτηματικό (;). Όπως και η C έτσι και η Java επιτρέπει

Διαβάστε περισσότερα

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

Κεφάλαιο 4 Διεργασίες Β Τάξη ΕΠΑΛ Κεφάλαιο 4 Διεργασίες Β Τάξη ΕΠΑΛ Καθ. Παπαδάκη Αν. Λειτουργικά Συστήματα 1 Περιγραφή Διεργασίας Στους υπολογιστές που έχουν μια μόνο ΚΜΕ, σε κάθε χρονική στιγμή μπορεί να εκτελείται μια μόνο εντολή γλώσσας

Διαβάστε περισσότερα

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

Μάθημα 3 ο ΔΙΕΡΓΑΣΙΕΣ (PROCESSES) Μάθημα 3 ο ΔΙΕΡΓΑΣΙΕΣ (PROCESSES) Εισαγωγή H κεντρική μονάδα επεξεργασίας (ΚΜΕ) και η κύρια μνήμη αποτελούν τα βασικά δομικά στοιχεία ενός υπολογιστικού συστήματος. Η πρώτη εκτελεί εντολές χειρισμού δεδομένων

Διαβάστε περισσότερα

Ανάπτυξη και Σχεδίαση Λογισμικού

Ανάπτυξη και Σχεδίαση Λογισμικού Ανάπτυξη και Σχεδίαση Λογισμικού Η γλώσσα προγραμματισμού C Γεώργιος Δημητρίου Συναρτήσεις της C Τα Λοιπά Στοίβα και μηχανισμός κλήσης Αναδρομικές συναρτήσεις Στατικές μεταβλητές Άλλα θέματα Μηχανισμός

Διαβάστε περισσότερα

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κλάσεις και Αντικείμενα Μέθοδοι Παράδειγμα 1 Θέλουμε ένα πρόγραμμα που να προσομοιώνει την κίνηση ενός αυτοκινήτου, το οποίο κινείται πάνω σε μία ευθεία πάντα

Διαβάστε περισσότερα

12.6. Άσκηση 6 - [αξιοποίηση γραφικής διεπαφής (GUI)] (έκδοση 2006)

12.6. Άσκηση 6 - [αξιοποίηση γραφικής διεπαφής (GUI)] (έκδοση 2006) exercise 6new_10 12/5/2008 12.6. Άσκηση 6 - [αξιοποίηση γραφικής διεπαφής (GUI)] (έκδοση 2006) 12.6.1. Περιγραφή Θεωρήστε την γραφική διεπαφή της αριθµοµηχανής των MS Windows. Μια παρόµοια διεπαφή (δες

Διαβάστε περισσότερα

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος 2001-2002 ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος 2001-2002 ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4 ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος 2001-2002 ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4 «Προγραμματισμός Η/Υ» - Τετράδιο Εργαστηρίου #4 2 Γενικά Στο Τετράδιο #4 του Εργαστηρίου θα αναφερθούμε σε θέματα διαχείρισης πινάκων

Διαβάστε περισσότερα

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Constructors ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κλάσεις και Αντικείμενα Constructors Μαθήματα από το lab Ένα πρόγραμμα αποτελείται από διάφορες κλάσεις και αντικείμενα αυτών των κλάσεων. Μία από τις κλάσεις

Διαβάστε περισσότερα

Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( )

Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( ) ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ Γεώργιος Παπαϊωάννου (2013-16) gepap@aueb.gr Περιγραφή: Μορφές μεταβίβασης ορισμάτων σε συναρτήσεις (και μεθόδους) και οι επιπτώσεις τους Επιστροφή τιμών από κλήση συναρτήσεων Υπερφόρτωση

Διαβάστε περισσότερα

ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής

ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής Στο εργαστήριο αυτό θα δούμε πώς ορίζονται και πώς χρησιμοποιούνται οι συμβολοσειρές στην C. Επίσης, θα μελετήσουμε κάποιες από τις συναρτήσεις

Διαβάστε περισσότερα

Τύποι Δεδομένων και Απλές Δομές Δεδομένων. Παύλος Εφραιμίδης V1.0 ( )

Τύποι Δεδομένων και Απλές Δομές Δεδομένων. Παύλος Εφραιμίδης V1.0 ( ) Τύποι Δεδομένων και Απλές Δομές Δεδομένων Παύλος Εφραιμίδης V1.0 (2014-01-13) Απλές Δομές Δεδομένων Στην ενότητα αυτή θα γνωρίσουμε ορισμένες απλές Δομές Δεδομένων και θα τις χρησιμοποιήσουμε για την αποδοτική

Διαβάστε περισσότερα

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

Εισαγωγή στη γλώσσα προγραμματισμού Java 69 Εισαγωγή στη γλώσσα προγραμματισμού Java 69 9. Animation σε Java 9.1 Γενικά περί Animation Ένας από τους καλύτερους τρόπους για να γίνει ένα πρόγραμμα σε Java ή μια σελίδα που τρέχει Java applet πιο ελκυστική,

Διαβάστε περισσότερα

public class ArrayStack implements Stack {

public class ArrayStack implements Stack { public class ArrayStack implements Stack { private static final int DEF_STACK_SIZE=2; //Array of objects private Object[] S; private int index ; // index, top, last, position // Returns the last item of

Διαβάστε περισσότερα

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΑΝΑΠΤΥΞΗ ΚΑΙ ΣΧΕΔΙΑΣΗ ΛΟΓΙΣΜΙΚΟΥ Η γλώσσα προγραμματισμού C ΕΡΓΑΣΤΗΡΙΟ 2: Εκφράσεις, πίνακες και βρόχοι 14 Απριλίου 2016 Το σημερινό εργαστήριο

Διαβάστε περισσότερα

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κλάσεις και Αντικείμενα Μέθοδοι Παράδειγμα Θέλουμε ένα πρόγραμμα που να προσομοιώνει την κίνηση ενός αυτοκινήτου, το οποίο κινείται και τυπώνει τη θέση του.

Διαβάστε περισσότερα

ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΕΙΡΑΙΩΣ ΣΧΟΛΗ ΤΕΧΝΟΛΟΓΙΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΕΠΙΚΟΙΝΩΝΙΩΝ ΤΜΗΜΑ ΨΗΦΙΑΚΩΝ ΣΥΣΤΗΜΑΤΩΝ «ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ»

ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΕΙΡΑΙΩΣ ΣΧΟΛΗ ΤΕΧΝΟΛΟΓΙΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΕΠΙΚΟΙΝΩΝΙΩΝ ΤΜΗΜΑ ΨΗΦΙΑΚΩΝ ΣΥΣΤΗΜΑΤΩΝ «ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ» ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΕΙΡΑΙΩΣ ΣΧΟΛΗ ΤΕΧΝΟΛΟΓΙΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΕΠΙΚΟΙΝΩΝΙΩΝ ΤΜΗΜΑ ΨΗΦΙΑΚΩΝ ΣΥΣΤΗΜΑΤΩΝ «ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ» ΗΜΕΡ.ΑΝΑΘΕΣΗΣ: Δευτέρα 21 Δεκεμβρίου 2015 ΗΜΕΡ.ΠΑΡΑΔΟΣΗΣ: Δευτέρα 25 Ιανουαρίου 2016 Διδάσκοντες:

Διαβάστε περισσότερα

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

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 6 : ΠΙΝΑΚΕΣ Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 6 : ΠΙΝΑΚΕΣ Κων. Κόκκινος ΠΙΝΑΚΕΣ (ARRAYS) Είναι χώροι της μνήμης για προσωρινή αποθήκευση δεδομένων του ίδιου τύπου. Οι πίνακες είναι δομές δεδομένων που τις

Διαβάστε περισσότερα

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 2 : ΜΕΤΑΒΛΗΤΕΣ ΤΕΛΕΣΤΕΣ & ΕΚΦΡΑΣΕΙΣ ΕΛΕΓΧΟΣ ΡΟΗΣ

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 2 : ΜΕΤΑΒΛΗΤΕΣ ΤΕΛΕΣΤΕΣ & ΕΚΦΡΑΣΕΙΣ ΕΛΕΓΧΟΣ ΡΟΗΣ Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 2 : ΜΕΤΑΒΛΗΤΕΣ ΤΕΛΕΣΤΕΣ & ΕΚΦΡΑΣΕΙΣ ΕΛΕΓΧΟΣ ΡΟΗΣ Κων. Κόκκινος Μεταβλητές-1 Οι μεταβλητές αποτελούν θέσεις μνήμης στις οποίες αποθηκεύονται τιμές αντίστοιχες

Διαβάστε περισσότερα

3. Προσομοίωση ενός Συστήματος Αναμονής.

3. Προσομοίωση ενός Συστήματος Αναμονής. 3. Προσομοίωση ενός Συστήματος Αναμονής. 3.1. Διατύπωση του Προβλήματος. Τα συστήματα αναμονής (queueing systems), βρίσκονται πίσω από τα περισσότερα μοντέλα μελέτης της απόδοσης υπολογιστικών συστημάτων,

Διαβάστε περισσότερα

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

Αντικειμενοστρεφής Προγραμματισμός ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΙΚΑ ΜΑΘΗΜΑΤΑ Αντικειμενοστρεφής Προγραμματισμός Ενότητα 11: Χειρισμός Σφαλμάτων Γρηγόρης Τσουμάκας, Επικ. Καθηγητής Άδειες Χρήσης Το παρόν εκπαιδευτικό

Διαβάστε περισσότερα

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

Λειτουργικά Συστήματα Η/Υ Λειτουργικά Συστήματα Η/Υ Κεφάλαιο 5 «Αμοιβαίος Αποκλεισμός» Διδάσκων: Δ Λιαροκάπης Διαφάνειες: Π. Χατζηδούκας 1 Αμοιβαίος Αποκλεισμός 1. Εισαγωγή 2. Κρίσιμα τμήματα (Critical Sections) 3. Υλοποίηση του

Διαβάστε περισσότερα

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

Διδάσκων: Παναγιώτης Ανδρέου Διάλεξη 22: Συγχρονισμός (Concurrency) Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Διεργασίες (processes) και Νήματα (threads) - Συγχρονισμός Νημάτων, Προβλήματα, Λύσεις - Οι τροποποιητές

Διαβάστε περισσότερα

Διάλεξη 06: Συνδεδεμένες Λίστες & Εφαρμογές Στοιβών και Ουρών

Διάλεξη 06: Συνδεδεμένες Λίστες & Εφαρμογές Στοιβών και Ουρών ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 1 Διάλεξη 06: Συνδεδεμένες Λίστες & Εφαρμογές Στοιβών και Ουρών Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Υλοποίηση ΑΤΔ με Συνδεδεμένες Λίστες -

Διαβάστε περισσότερα

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κλάσεις και Αντικείμενα Μέθοδοι Παράδειγμα 1 Θέλουμε ένα πρόγραμμα που να προσομοιώνει την κίνηση ενός αυτοκινήτου, το οποίο κινείται πάνω σε μία ευθεία πάντα

Διαβάστε περισσότερα

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

Αντικειμενοστραφής Προγραμματισμός Κλάσεις Αντικειμενοστραφής Προγραμματισμός Κλάσεις-Αντικείμενα Ένα παράδειγμα Συναρτήσεις κατασκευής (Constructors) Συνάρτηση καταστροφής (Destructor) Συναρτήσεις πρόσβασης (Access Functions) Συνάρτηση

Διαβάστε περισσότερα

B. Ενσωμάτωση Ιθαγενών Μεθόδων

B. Ενσωμάτωση Ιθαγενών Μεθόδων B. Ενσωμάτωση Ιθαγενών Μεθόδων Στο τέλος αυτού του κεφαλαίου θα μπορείτε: Να δημιουργείτε κώδικα Java που θα φορτώνει βιβλιοθήκες και θα καλεί ιθαγενείς μεθόδους (native methods). Να χρησιμοποιείτε τη

Διαβάστε περισσότερα

1. Εισαγωγή. Λειτουργικά Συστήματα Η/Υ. Διεργασίες. Ορισμός ΚΕΦΑΛΑΙΟ 3 - ΔΙΕΡΓΑΣΙΕΣ. Κεφάλαιο 3 «Διεργασίες»

1. Εισαγωγή. Λειτουργικά Συστήματα Η/Υ. Διεργασίες. Ορισμός ΚΕΦΑΛΑΙΟ 3 - ΔΙΕΡΓΑΣΙΕΣ. Κεφάλαιο 3 «Διεργασίες» 1. Εισαγωγή Λειτουργικά Συστήματα Η/Υ Κεφάλαιο 3 «Διεργασίες» Διδάσκων: Δ Λιαροκάπης Διαφάνειες: Π. Χατζηδούκας Η έννοια της διεργασίας (process) είναι θεμελιώδης για την κατανόηση του τρόπου με τον οποίο

Διαβάστε περισσότερα

Λειτουργικά Συστήματα. Τ.Ε.Ι. Ιονίων Νήσων Σχολή Διοίκησης και Οικονομίας - Λευκάδα

Λειτουργικά Συστήματα. Τ.Ε.Ι. Ιονίων Νήσων Σχολή Διοίκησης και Οικονομίας - Λευκάδα Λειτουργικά Συστήματα Τ.Ε.Ι. Ιονίων Νήσων Σχολή Διοίκησης και Οικονομίας - Λευκάδα Στέργιος Παλαμάς, Υλικό Μαθήματος «Λειτουργικά Συστήματα», 2015-2016 Κεφάλαιο 4: Διεργασίες Πρόγραμμα Πρόγραμμα 1 Πρόγραμμα

Διαβάστε περισσότερα

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

Ειδικά Θέματα Προγραμματισμού Ειδικά Θέματα Προγραμματισμού Ενότητα 3: Τύποι Δεδομένων - Τελεστές Μιχάλας Άγγελος Τμήμα Μηχανικών Πληροφορικής ΤΕ Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons.

Διαβάστε περισσότερα

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

Αντικειμενοστρεφής Προγραμματισμός ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΙΚΑ ΜΑΘΗΜΑΤΑ Αντικειμενοστρεφής Προγραμματισμός Ενότητα 15: Σχεδίαση Εφαρμογών Γρηγόρης Τσουμάκας, Επικ. Καθηγητής Άδειες Χρήσης Το παρόν εκπαιδευτικό

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

ΠΛΗΡΟΦΟΡΙΚΗ ΙI Ενότητα 3: Έλεγχος ροής προγράμματος

ΠΛΗΡΟΦΟΡΙΚΗ ΙI Ενότητα 3: Έλεγχος ροής προγράμματος ΠΛΗΡΟΦΟΡΙΚΗ ΙI Ενότητα 3: Έλεγχος ροής προγράμματος Μιχάλης Δρακόπουλος Σχολή Θετικών επιστημών Τμήμα Μαθηματικών ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (Java) Ενότητα 3 ΕΛΕΓΧΟΣ ΡΟΗΣ ΠΡΟΓΡΑΜΜΑΤΟΣ Ι. Ελεγκτές συνθηκών ή περιπτώσεων:

Διαβάστε περισσότερα

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

Εισαγωγή στη γλώσσα προγραμματισμού JAVA. Δομές Δεδομένων Διδάσκων: Π.Α. Μήτκας Τομέας Ηλεκτρονικής και Υπολογιστών Εισαγωγή στη γλώσσα προγραμματισμού JAVA Δομές Δεδομένων Διδάσκων: Π.Α. Μήτκας Τομέας Ηλεκτρονικής και Υπολογιστών Το πρώτο φλιτζάνι Java Λίστα με τα απαραίτητα Το πρώτο μου πρόγραμμα(hello World) Συνεχίζοντας

Διαβάστε περισσότερα

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα ως ορίσματα Εισαγωγή στις αναφορές ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Αντικείμενα ως ορίσματα Εισαγωγή στις αναφορές Αντικείμενα ως ορίσματα Μπορούμε να περνάμε αντικείμενα ως ορίσματα σε μία μέθοδο όπως οποιαδήποτε άλλη μεταβλητή

Διαβάστε περισσότερα

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

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 18/3/2008 ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 18/3/2008 - Παράδειγμα με switch (το οποίο δείχνει επίσης πότε σε μια άσκηση χρησιμοποιούμε user-input και System.out.println() για έξοδο και πότε χρησιμοποιούμε είσοδο σε μέθοδο

Διαβάστε περισσότερα

Διάλεξη 5: Κλάσεις και Αντικείμενα. Διδάσκων: Παναγιώτης Ανδρέου

Διάλεξη 5: Κλάσεις και Αντικείμενα. Διδάσκων: Παναγιώτης Ανδρέου Διάλεξη 5: Κλάσεις και Αντικείμενα Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: Εισαγωγή στις έννοιες: - Κλάσεις και Αντικείμενα - Κατασκευή, Πρόσβαση Αντικειμένων - Διαχείριση Μνήμης, Garbage

Διαβάστε περισσότερα

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

ιεργασίες και νήµατα Προγραµµατισµός ΙΙΙ 1 lalis@inf.uth.gr ιεργασίες και νήµατα Προγραµµατισµός ΙΙΙ 1 lalis@inf.uth.gr Η έννοια της διεργασίας ιεργασία (process) είναι ο µηχανισµός εκτέλεσης ενός προγράµµατος σε ένα λειτουργικό σύστηµα. Η διεργασία είναι µια ενεργή

Διαβάστε περισσότερα

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

Ιδιοκτησία Αντικειµένου Software Transactional Memory H STM υποστηρίζει την εκτέλεση δοσοληψιών από τις διεργασίες, οι οποίες περιέχουν λειτουργίες που ο χρήστης θέλει να εκτελέσει στα διαµοιραζόµενα αντικείµενα. H STM εγγυάται

Διαβάστε περισσότερα

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

Πολυνηµατικές εφαρµογές σε Java Πολυνηµατικές εφαρµογές σε Java Σταύρος Πολυβίου Τί είναι ένα νήµα (thread); Ας ορίσουµε πρώτα το τί είναι µία διεργασία (process): Ένα αυτοδύναµο περιβάλλον εκτέλεσης (selfcontained execution environment).

Διαβάστε περισσότερα

Επιλέξτε Σωστό ή Λάθος για καθένα από τα παρακάτω:

Επιλέξτε Σωστό ή Λάθος για καθένα από τα παρακάτω: Επιλέξτε Σωστό ή Λάθος για καθένα από τα παρακάτω: 1ο ΓΕΛ Καστοριάς Βασικές Έννοιες Αλγορίθμων Δομή Ακολουθίας (κεφ. 2 και 7 σχολικού βιβλίου) 1. Οι μεταβλητές αντιστοιχίζονται από τον μεταγλωττιστή κάθε

Διαβάστε περισσότερα

2. Προσδιοριστές, δεσμευμένες λέξεις και τύποι

2. Προσδιοριστές, δεσμευμένες λέξεις και τύποι 2. Προσδιοριστές, δεσμευμένες λέξεις και τύποι Τελειώνοντας αυτό το κεφάλαιο θα μπορείτε: Να χρησιμοποιείτε σχόλια σε ένα πηγαίο πρόγραμμα Java. Να διακρίνετε σωστούς από λάθος προσδιοριστές. Να αναγνωρίζετε

Διαβάστε περισσότερα