Γαβαλάς Δαμιανός dgavalas@aegean.gr



Σχετικά έγγραφα
Week 7: Java Collection Classes

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

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

Week. 6: Java Collections

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

Collections Lists - ArrayLists. Παναγιώτης Σφέτσος, PhD

H κλάση ArrayList. Γιώργος Θάνος. Γραφείο Γ. Γκλαβάνη 37. Αντικει ενοστραφής Προγρα. ος όροφος

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

Προγραμματισμός ΙΙ (Java) 7. Συλλογές δεδομένων

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

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

HY-252 Αντικειμενοστραφής Προγραμματισμός. Χειμερινό Εξάμηνο 2012 Διδάσκων: Χριστοφίδης Βασίλης. Ημερομηνία Παράδοσης: 16/11/2012

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

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

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

Βασικές Έννοιες Δοµών Δεδοµένων

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

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

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. Συλλογές και Επαναλήπτες. Συλλογές - Collections

Standard Template Library (STL) C++ library

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

Java Μέρος Ι Αντικειμενοστρεφής Προγραμματισμός - 7

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

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

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

Απλές Δοµές Δεδοµένων Στην ενότητα αυτή θα γνωρίσουµε ορισµένες απλές Δοµές Δεδοµένων και θα τις χρησιµοποιήσουµε για την αποδοτική επίλυση του προβλή

ΠΑΡΑΡΤΗΜΑ: QUIZ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

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

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

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

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

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

Δομές Δεδομένων Standard Template Library (STL) 23/3/2017 ΜΠΟΜΠΟΤΑΣ ΑΓΟΡΑΚΗΣ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Συλλογές

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

ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 5. Αφηρημένοι Τύποι Δεδομένων / Στοίβες και Ουρές

Σι θα δούμε σε αυτό το μάθημα;

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

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

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

Προγραμματισμός ΙΙ (Java) 3. Διαχείριση πολλαπλών αντικειμένων

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

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

4 Συλλογές Αντικειμένων

Διάλεξη 05: Αφηρημένοι Τύποι Δεδομένων

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

Δηµοσθένης Σταµάτης Τµήµα Πληροφορικής T.E.I. ΘΕΣΣΑΛΟΝΙΚΗΣ

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

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

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

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Σύνθεση αντικειμένων

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ. Δηµοσθένης Σταµάτης Τµήµα Πληροφορικής

Πίνακες (Μια παλιά άσκηση) Πίνακες Κατακερματισμού (Hash Tables) Πίνακες (Μια παλιά άσκηση) Εισαγωγή. A n

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

Δομές Δεδομένων. Δημήτρης Μιχαήλ. Υλοποίηση Δυαδικού Σωρού σε γλώσσα Java. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

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

Wrapper Classes, Abstract Classes and Interfaces

Δομές Δεδομένων & Αλγόριθμοι

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Γενικευμένες κλάσεις Συλλογές

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

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

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

Διάλεξη 16: Σωροί. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Ουρές Προτεραιότητας - Ο ΑΤΔ Σωρός, Υλοποίηση και πράξεις

Σύνοψη Προηγούμενου. Λίστες (Lists) Συνδεδεμένες Λίστες: Εισαγωγή (1/2) Συνδεδεμένες Λίστες. Ορέστης Τελέλης

Διάλεξη 16: Σωροί. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Ουρές Προτεραιότητας - Ο ΑΤΔ Σωρός, Υλοποίηση και πράξεις

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

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

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

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

Διάλεξη 07: Λίστες Ι Υλοποίηση & Εφαρμογές

Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων ομές εδομένων

Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων ομές εδομένων

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Συλλογές

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

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

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

Δομές Δεδομένων (Data Structures)

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

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

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

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ. Δομές Δεδομένων. Ιωάννης Γ. Τόλλης Τμήμα Επιστήμης Υπολογιστών Πανεπιστήμιο Κρήτης

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

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

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

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

Στόχοι και αντικείμενο ενότητας. Πέρασμα Πίνακα σε Συνάρτηση (συν.) Πέρασμα Πίνακα σε Συνάρτηση. #8.. Ειδικά Θέματα Αλγορίθμων

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

Σύνοψη Προηγούμενου (1/2) Στοίβες, Ουρές, Ουρές Προτεραιότητας. Σύνοψη Προηγούμενου (2/2) Σημερινό Μάθημα. Πίνακες. Εισαγωγή, σε χρόνο O(1).

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

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

JDSL Java Data Structures Library

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

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

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

Διάλεξη 08: Λίστες ΙΙ Κυκλικές Λίστες

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

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

Transcript:

Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Διάλεξη #10 η : Ίνες και πολυνηματικός προγραμματισμός, Δυναμικές δομές δεδομένων στη Java Γαβαλάς Δαμιανός dgavalas@aegean.gr 1

Νήματα Ένα νήμα (thread) από έναν επεξεργαστή μπορεί να συνδεθεί με μια διεργασία (process) ώστε αυτή να εκτελείται παράλληλα με άλλες διεργασίες Ένα νήμα ελέγχου αφορά σε μια διεργασία που εκτελεί σειριακά μια ακολουθία εντολών Η δυνατότητα εκτέλεσης πολλών διεργασιών ταυτόχρονα με τη χρήση νημάτων χαρακτηρίζεται ως πολυνηματισμός (multithreading) Η δυνατότητα του πολυνηματισμού μ παρέχεται από το λειτουργικό σύστημα Δίδεται έτσι η δυνατότητα της ταυτόχρονης εκτέλεσης πολλαπλών διεργασιών Στα πολυεπεξεργαστικά (multiprocessor) συστήματα τα νήματα κατανέμονται στους πολλαπλούς επεξεργαστές Παράδειγμα Ένα παιχνίδι παράλληλα με τη δράση εξελίσσεται ηχητική υπόκρουση παράλληλα λ με τον ήρωα του παιχνιδιού κινούνται και πυροβολούν οι εχθροί Μια κατάλληλη υλοποίηση θα ήταν η διεργασία που αναπαράγει το ηχητικό αρχείο αλλά και ο κώδικας που ρυθμίζει τη συμπεριφορά τόσο του ήρωα όσο και των εχθρών να λειτουργούν ως διακριτά νήματα 2

Νήματα στη Java Η Java παρέχει πλήρη υποστήριξη για τη δημιουργία και διαχείριση νημάτων: Για την ενθυλάκωση της πληροφορίας που συνοδεύει ένα νήμα χρησιμοποιείται η κλάση Thread Για τη δημιουργία ενός νήματος ελέγχου δημιουργείται ένα νέο στιγμιότυπο της κλάσης Thread Ένα νήμα μπορεί να καλέσει οποιαδήποτε μέθοδο αντικειμένου του ίδιου προγράμματος στο οποίο έχει πρόσβαση Δημιουργία νημάτων Οι δημιουργοί της Java προέβλεψαν δύο διαφορετικούς τρόπους για τη δημιουργία νημάτων Επεκτείνοντας/κληρονομώντας της κλάσης Thread (extending Thread class) Με αυτό τον τρόπο κληρονομούνται οι μέθοδοι και μεταβλητές της γονικής κλάσης Σε αυτή την περίπτωση μια κλάση μπορεί να κληρονομήσει μόνο μια γονική κλάση (μειονέκτημα!) Υλοποίηση της διεπαφής Runnable (implementing Runnable interface) Απαντάει στο πρόβλημα της πολλαπλάς κληρονομικότητας Μια κλάση μπορεί να κληρονομεί μία κλάση και να κληρονομεί μία ή περισσότερες διεπαφές Αυτή η περίπτωση είναι πολύ βολική όταν η κλάση που υλοποιεί τη διεπαφή πρέπει ούτως ή άλλως να κληρονομήσει μια άλλη κλάση, π.χ. την κλάση java.awtapplet (όταν δηλαδή είναι applet) 3

Δημιουργία νημάτων public class Counter extends Thread { public void run() {... Κληρονομώντας την κλάση Thread public class Counter implements Runnable { Thread T; public void run() {... Υλοποιώντας το interface Runnable H Κλάση Thread Thread() Thread(String name)... String getname() int getpriority() void interrupt() static Boolean interrupted() Boolean isalive() void join() void run() void setname(string name) void setpriority(int newpriority) static void sleep(long millis) void start() String tostring() static void yield() 4

H Κλάση Thread (συν.) Κατασκευαστές (constructors): public Thread(String threadname) Δημιουργεί ένα νήμα με όνομα που προσδιορίζει το όρισμα threadname. public Thread() Δημιουργεί ένα νήμα με όνομα τη συνένωση του αλφαριθμητικού Thread με έναν ακέραιο, π.χ. Thread 1, Thread 2, κ.λπ. Μετά τη δημιουργία ενός στιγμιοτύπου (0bject) της κλάσης Thread, το νήμα πρέπει να: Διαμορφωθεί (configured): Απόδοση ονόματος, προτεραιότητας και λοιπών παραμέτρων. Εκτελεστεί: κλήση της start(). H Κλάση Thread (συν.) H μέθοδος start() Δημιουργεί ένα νέο νήμα με τα δεδομένα του στιγμιοτύπου Καλεί τη μέθοδο run() Επιστρέφει τον έλεγχο στο σημείο κλήσης της Εγείρει μια εξαίρεση illegalthreadstateexception, αν το νήμα στο οποίο απευθύνεται έχει ήδη ξεκινήσει Το νέο νήμα εκτελείται ταυτόχρονα με το νήμα που το δημιούργησε Η μέθοδος run περιέχει τον κώδικα που είναι επιθυμητό να περιέχει το νήμα Μέθοδος sleep: Βάζει το νήμα σε ανάπαυση Έχει ως όρισμα το χρόνο ανάπαυσης σε χιλιοστά του δευτερολέπτου Κατά τη διάρκεια ανάπαυσης το νήμα δεν ανταγωνίζεται για τη χρήση του επεξεργαστή > επιτρέπει την εκτέλεση νημάτων χαμηλότερης προτεραιότητας 5

H Κλάση Thread (συν.) Μέθοδος interrupt: Έχει ως αποτέλεσμα τη διακοπή ενός νήματος εκτέλεσης. Μέθοδος interrupted: Επιστρέφει true αν το νήμα έχει διακοπεί, αλλιώς επιστρέφει false. Μέθοδος suspend: Αναστέλλει τη λειτουργία ενός νήματος εκτέλεσης. Μέθοδος resume: Ξαναρχίζει την εκτέλεση ενός νήματος που έχει ανασταλλεί. Μέθοδος stop: Τερματίζει την εκτέλεση ενός νήματος. Μέθοδος isalive: Επιστρέφει true, αν έχει κληθεί η start για ένα νήμα και το νήμα δεν έχει τερματιστεί (είτε με τη stop, είτε με το τέλος της run) Μέθοδος currentthread: Επιστρέφει μια αναφορά στο τρέχον νήμα. Mέθοδοι setname, getname, setpriority, getpriority: Παρέχουν πρόσβαση στο όνομα και στην προτεραιότητα ενός νήματος. Απλό παράδειγμα με ίνες class SimpleThread extends Thread { public SimpleThread(String str) { super(str); public void run() { for (int i = 0; i < 10; i++) { System.out.println(i + " " + getname()); try { sleep((int)(math.random() * 1000)); catch (InterruptedException e) { System.out.println("DONE! " + getname()); 6

Απλό παράδειγμα με ίνες (συν.) class TwoThreadsTest { public static void main (String[] args) { SimpleThread t1 = new SimpleThread("Jamaica"); SimpleThread t2 = new SimpleThread("Fiji"); t1.start(); t2.start(); Δημιουργεί και προκαλεί την εκτέλεση δύο ινών Το αποτέλεσμα της εκτέλεσης του προγράμματος Παράδειγμα: applet που εμφανίζει αντίστροφη μέτρηση import java.awt.graphics; import java.awt.font; public class DigitalClock extends java.applet.applet implements Runnable { Font thefont = new Font("TimesRoman",Font.BOLD,24); int countdown=10; Thread runner; public void start() { if (runner == null) { runner = new Thread(this); runner.start(); 7

Παράδειγμα: applet που εμφανίζει αντίστροφη μέτρηση public void stop() { if (runner!= null) { runner = null; public void run() { Thread thisthread = Thread.currentThread(); while (runner == thisthread) { countdown ; repaint(); try { Thread.sleep(1000); catch (InterruptedException e) { public void paint(graphics screen) { screen.setfont(thefont); screen.drawstring("" + thedate.tostring(), 10, 50); Παράδειγμα: Κίνηση import java.awt.graphics; import java.awt.image; import java.awt.color; public class Neko extends java.applet.applet implements Runnable { Image nekopics[] = new Image[9]; Image currentimg; Thread runner; int x; int y = 50; 8

Παράδειγμα: Κίνηση public void init() { String nekosrc[] = { "right1.gif", "right2.gif, "stop.gif", "yawn.gif gif", "scratch1.gif gif", "scratch2.gif gif","sleep1.gif gif", "sleep2.gif", "awake.gif" ; for (int i=0; i < nekopics.length; i++) { /* φορτώνει τις εικόνες η επαλληλία των οποίων δημιουργεί την εντύπωση της κίνησης */ nekopics[i] = getimage(getcodebase(), "images/" + nekosrc[i]); Παράδειγμα: Κίνηση public void start() { if (runner == null) { runner = new Thread(this); runner.start(); public void stop() { runner = null; 9

Παράδειγμα: Κίνηση public void run() { setbackground(color.white); // run from one side of the screen to the middle nekorun(0, size().width / 2); // stop and pause currentimg = nekopics[2]; // sleep for 5 "turns" repaint(); nekosleep(5); pause(1000); // wake up and run off // yawn currentimg = nekopics[3]; repaint(); pause(1000); // scratch four times nekoscratch(4); currentimg = nekopics[8]; repaint(); pause(500); nekorun(x, size().width + 10); Παράδειγμα: Κίνηση void nekorun(int start, int end) { for (int i = start; i< end; i+= 10) { x = i; // swap images if (currentimg == nekopics[0]) currentimg = nekopics[1]; else currentimg = nekopics[0]; repaint(); pause(150); 10

Παράδειγμα: Κίνηση void nekoscratch(int numtimes) { for (int i = numtimes; i > 0; i ) { currentimg = nekopics[4]; repaint(); pause(150); currentimg = nekopics[5]; repaint(); pause(150); Παράδειγμα: Κίνηση void nekosleep(int numtimes) { for (int i = numtimes; i > 0; i ) { currentimg = nekopics[6]; repaint(); pause(250); currentimg = nekopics[7]; repaint(); pause(250); 11

Παράδειγμα: Κίνηση void pause(int time) { try { Thread.sleep(time); catch (InterruptedException e) { public void paint(graphics screen) { if (currentimg!= null) screen.drawimage(currentimg, x, y, this); Παράδειγμα: Κίνηση 12

Τι είναι μια δομή δεδομένων; Μια δομή δεδομένων είναι μια συλλογή από δεδομένα που οργανώνονται με κάποιο τρόπο Μια δομή δεδομένων δ δεν αποθηκεύει απλά δεδομένα δ αλλά υποστηρίζει και λειτουργίες για το χειρισμό των δεδομένων της δομής Π.χ. ένας πίνακας (array) είναι μια δομή δεδομένων που διατηρεί μια λίστα δεδομένων σειριακά Μπορείς να βρεις το μέγεθος του array, να αποθηκεύσεις, ανακτήσεις, και τροποποιήσεις τα δεδομένα στο array Το array είναι απλό και εύκολο στο χειρισμό και τη χρήση του αλλά έχει δύο βασικά μειονεκτήματα 13

Περιορισμοί των arrays 1. Αφότου δημιουργηθεί ένα array, το μέγεθός του δεν μπορεί να τροποποιηθεί 2. Το array παρέχει μη ικανοποιητική υποστήριξη λειτουργιών εισαγωγής, διαγραφής, ταξινόμησης και αναζήτησης Συνεπώς προκύπτει η ανάγκη για δυναμικές δομές δεδομένων!! Τέσσερις κλασικές δομές δεδομένων Τέσσερις κλασικές δυναμικές δομές δεδομένων που εισάγονται σε αυτή τη διάλεξη είναι οι λίστες (lists), στοίβες (stacks), ουρές (queues) και δυαδικά δέντρα (binary trees) Μια λίστα είναι μια συλλογή από δεδομένα που αποθηκεύονται σειριακά Υποστηρίζει εισαγωγή και διαγραφή οπουδήποτε στη λίστα Μια στοίβα θεωρείται ένας ειδικός τύπος λίστας όπου οι εισαγωγές/διαγραφές γίνονται μόνο στο άκρο της (κορυφή) Μια ουρά αναπαριστά μια λίστα αναμονής όπου οι εισαγωγές γίνονται στο «πίσω» μέρος και οι διαγραφές στην κορυφή της ουράς Ένα δυαδικό δέντρο είναι μια δομή δεδομένων που υποστηρίζει αποδοτική αναζήτηση, ταξινόμηση, εισαγωγή και διαγραφή δεδομένων 14

Υλοποιήσεις Τύποι συλλογών δεδομένων Τεχνικές υλοποίησης List Set linked array Map Δομές δεδομένων συλλογών Java Η Java χρησιμοποιεί τις παρακάτω δομές δεδομένων στις υλοποιήσεις των συλλογών: Συνδεδεμένη λίστα [linked list] Δυναμικό διάνυσμα [resizable array] «Ισοσκελισμένο» δένδρο [balnanced tree] Πίνακα κατακερματισμού [hash table] 15

Συνδεδεμένη λίστα [linked list] Δομή βασισμένη αποκλειστικά σε «συνδέσμους» [links] Δυναμικό διάνυσμα [resizable array] Βασίζεται σε απλά διανύσματα Χρησιμοποιεί επανακαταχώρηση [reallocation] 16

«Ισοσκελισμένο» δένδρο [balnanced tree] Συνδεδεμένη δομή Δυαδικό (στηνη Java) Πάντοτε ισοσκελισμένο (μέσω ανακατανομής των στοιχείων του [reshuffling]) Πίνακας κατακερματισμού [hash table] Συνδυασμός διανύσματος και συνδεδεμένης δομή Χρησιμοποιεί τιμές κατακερματισμού μ [hash values] για την τοποθέτηση των στοιχείων στην κατάλληλη θέση Πολύ γρήγορη ανάκτηση στοιχείων 17

Υλοποιήσεις υλοποιήσεις διαπροσωπείες List Set Map Υλοποιήσεις συλλογών δεδομένων Java υλοποιήσεις interfaces List ArrayList LinkedList Set HashSet TreeSet Map HashMap TreeMap 18

Υλοποιήσεις συλλογών δεδομένων Java List: ArrayList (σταθερός χρόνος προσπέλασης, χρησιμοποιείται στις περισσότερες περιπτώσεις) LinkedList (γρήγορη εισαγωγή στοιχείων) Set: HashSet (γρήγορη δομή, χρησιμοποιείται στις περισσότερες περιπτώσεις) TreeSet t( (ταξινομημένη) ξ έ Map: HashMap (γρήγορη δομή) TreeMap (ταξινομημένη) Οι συλλογές στην Java 1.1 Τι απέγιναν οι κλάσεις Vector και Hashtable; Στην Java 2 (JDK 1.2) Η κλάση Vector έχει αντικατασταθεί από την ArrayList Η κλάση Hashtable έχει αντικατασταθεί από την HashMap Στην Java 2 πρέπει να χρησιμοποιούμε τις νέες κλάσεις συλλογής δεδομένων 19

«Διαπροσπελαστές» [iterators] Οι διαπροσπελαστές [iterators] χρησιμοποιούνται για να προσπελαστούν τα αντικείμενα μίας συλλογής δεδομένων Επιστρέφει ένα αντικείμενο διαπροσπελαστή προς μια συλλογή public interface Collection {... Iterator iterator(); public interface Iterator { boolean hasnext(); Object next(); void remove(); Χρήση διαπροσπελαστών [iterators] Συνήθης κώδικας για την προσπέλαση των στοιχείων μιας συλλογής: void printall(collection people) { for (Iterator i = people.iterator(); i.hasnext(); ) { Person person = (Person)i.next(); person.print(); Πολυμορφικός (Όμοιοι με τους «enumerations» της Java 1.1, με σωστή λειτουργία κατά τη διαγραφή στοιχείων) 20

«Μαζικές» [bulk] λειτουργίες boolean containsall(collection c); Επιστρέφει true εάν η συλλογή περιέχει όλα τα στοιχεία της συλλογής c που δίδεται σαν παράμετρος. boolean addall(collection c); Εισάγει όλα τα στοιχεία της συλλογής c που δίδεται σαν παράμετρος στην παρούσα συλλογή. boolean removeall(collection c); ιαγράφει από την συλλογή τα στοιχεία τα οποία περιέχονται επίσης στην συλλογή c που δίδεται σαν παράμετρος «Μαζικές» [bulk] λειτουργίες (2) boolean retainall(collection c); Κρατάει στη συλλογή τα στοιχεία τα οποία περιέχονται επίσης στην συλλογή c που δίδεται σαν παράμετρος και διαγράφει τα υπόλοιπα. void clear(); ιαγράφει όλα τα στοιχεία από τη συλλογή. 21

Λειτουργίες διανυσμάτων Για συμβατότητα με προηγούμενες εκδόσεις [backwards compatibility] οι συλλογές μπορεί να μετατραπούν σε διανύσματα: Object[] toarray(); Object[] toarray(object a[]); Μετατροπή σε διανυσμα από Objects: Object[] a = c.toarray(); Γεμίζει προϋπάρχων δά διάνυσμα από Strings c.toarray(new String[c.size()]); Μετατρέπει σε νέο διανυσμα από Strings: String[] a = (String[])c.toArray(new String[0]); Αλγόριθμοι Στην κλάση Collections περιέχονται διάφοροι γενικής χρήσης αλγόριθμοι (στατικές μέθοδοι): static int binarysearch (List list, Object key) Ψάχνει τη συγκεκριμένη λίστα για ένα συγκεκριμένο αντικείμενο χρησιμοποιώντας τον αλγόριθμο δυαδικής αναζήτησης static void copy (List dest, List src) Αντιγράφει όλα τα στοιχεία από μια λίστα σε μια άλλη static void fill (List list, Object o) Αντικαθιστά όλα τα στοιχεία μιας συγκεκριμένης λίστας με ένα δοσμένο στοιχείο static Object max (Collection coll) Επιστρέφει το μέγιστο στοιχείο μιας δοσμένης συλλογής, σύμφωνα με τη φυσική διάταξη των στοιχείων της static Object min (Collection coll) Επιστρέφει το ελάχιστο στοιχείο από μια δοσμένη συλλογή, σύμφωνα με τη φυσική διάταξη των στοιχείων της 22

Αλγόριθμοι (2) static void reverse(list l) Αναστρέφει τη σειρά των στοιχείων στη δοσμένη λίστα static void shuffle(list list) «Ανακατεύει» τυχαία τη συγκεκριμένη λίστα χρησιμοποιώντας μια προκαθορισμένη πηγή τυχαιότητας static void sort(list list) Ταξινομεί τη συγκεκριμένη λίστα σε αύξουσα σειρά, σύμφωνα με τη φυσική διάταξη των στοιχείων της static Set singleton(object o) Επιστρέφει ένα μη μεταβλητό σύνολο που περιέχει μόνο το συγκεκριμένο αντικείμενο c.removeall(collections.singleton(e)); Το interface Set public interface Set { Ήδη δηλωμένα στην Collection int size(); boolean isempty(); boolean contains(object t element); boolean add(object element); boolean remove(object element); Iterator iterator(); boolean containsall(collection c); boolean addall(collection c); boolean removeall(collection c); boolean retainall(collection c); void clear(); Object[] toarray(); Object[] toarray(object a[]); 23

Το interface List public interface List extends Collection { // Positional Access Object get(int index); Object set(int index, Object element); void add(int index, Object element); Object remove(int index); abstract boolean addall(int index, Collection c); // Search int indexof(object o); int lastindexof(object o); ListIterator listiterator(); ListIterator listiterator(int index); List sublist(int from, int to); Το interface Map public interface Map { Object put(object key, Object value); Object get(object key); boolean containskey(object key); boolean containsvalue(object value); public Set keyset(); public Collection values(); public Set entryset(); (όχι πλήρες...) // Interface for entryset elements public interface Entry { Object getkey(); Object getvalue(); Object setvalue(object value); 24

Παράδειγμα χρήσης ArrayList List lista = new ArrayList(); List listb = new ArrayList(); lista.add("alex"); lista.add("melody"); lista.add("jeff"); lista.add("alex"); Iterator i = lista.iterator(); while (i.hasnext()) { System.out.println(i.next()); Ανακτά ένα αντικείμενο από ένα ArrayList χρησιμοποιώντας έναν Iterator και εμφανίζει: Alex Melody Jeff Alex Παράδειγμα χρήσης ArrayList for (int j=0; j < lista.size(); j++) { System.out.println("[" ([ + j + "] " + lista.get(j)); Ανακτά ένα αντικείμενο από ένα ArrayList χρησιμοποιώντας έναν Εμφανίζει: Ηθέση του String "Jeff" είναι: Τελευταία εμφάνιση του String "Alex": 3 Iterator και εμφανίζει: [0] Alex [1] Melody [2] Jeff [3] Alex int locationindex = lista.indexof("jeff"); System.out.println("Η θέση του String \"Jeff\" είναι: " + locationindex); System.out.println("Τελευταία εμφάνιση του String \"Alex\":" + lista.lastindexof("alex")); 25

Παράδειγμα χρήσης ArrayList Αρχική λίστα : [Alex, Jeff] List listsub = lista.sublist(2, (, lista.size()); System.out.println("Αρχική λίστα : " + listsub); Collections.sort(listSub); System.out.println("Νέα ταξινομημένη λίστα : " + listsub); Νέα ταξινομημένη λίστα : [Alex, Jeff] Collections.reverse(listSub); System.out.println("Αντεστραμμένη λίστα : " + listsub); Αντεστραμμένη λίστα : [Alex, Jeff] 26