Διάλεξη 4. Νήματα (Threads) στην Java Συγχρονισμός Εξωτερικές διεργασίες Collections & Generics Διαχείριση σφαλμάτων στην Java

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

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

NATIONAL & KAPODISTRIAN UNIVERSITY OF ATHENS. Διαχείριση Δικτύων. Nikolas Bompetsis

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

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

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

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

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

ιάλεξη 3 Τµήµα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισµικού Χειµερινό Εξάµηνο ιάλεξη 3

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

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

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

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

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

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

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

ιάλεξη 5 Νήµατα (Threads) στην Java Συγχρονισµός Singleton Pattern Producer-Consumer problem Γραφικάµε Java - JavaFX

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

Εξαιρέσεις στην Java EXCEPTIONS IN JAVA

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

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

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

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

Week. 6: Java Collections

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

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

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

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

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

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

Εργαστήριο Λειτουργικών Συστημάτων 8o εξάμηνο, Ροή Υ, ΗΜΜΥ

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιαχείριση Εξαιρέσεων. Εισαγωγή στη ιαχείριση Εξαιρέσεων

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

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

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

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

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

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

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

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

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

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

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

Week 7: Java Collection Classes

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

$./jms console -w <jms in> -r <jms out> -o <operations file> namedpipe. (standard input).

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

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

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

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

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

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

ΠΛΗΡΟΦΟΡΙΚΗ ΙI Ενότητα 10: Exceptions handling (Χειρισμός εξαιρέσεων)

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

Χειρισμός Εξαιρέσεων EXCEPTIONS IN JAVA

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

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

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

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

Το λειτουργικό σύστημα. Προγραμματισμός II 1

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

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

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

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

Υποστήριξη Λ.Σ. ΜΥΥ-106 Εισαγωγή στους Η/Υ και στην Πληροφορική

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

Το λειτουργικό σύστημα. Προγραμματισμός II 1

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

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

Εξαιρέσεις. try, catch, finally, throw, throws

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

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

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

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

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

Προγραμματισμός Ι. Προχωρημένα Θέματα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

. Μεθοδολογία Προγραμματισμού. Μοτίβα σχεδίασης (Design Patterns) Νικόλαος Πεταλίδης. Εισαγωγή Εαρινό Εξάμηνο 2014

Προβλήματα ταυτόχρονης εκτέλεσης (για νήματα με κοινή μνήμη)

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

Διαχείριση Περιεχομένου Παγκόσμιου Ιστού και Γλωσσικά Εργαλεία ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ FILE & PROCESS HANDLING

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

Δομές Δεδομένων - Εργαστήριο 2. Λίστες

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

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

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

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

Το λειτουργικό σύστημα. Προγραμματισμός II 1

Προβλήματα ταυτόχρονης εκτέλεσης (για νήματα με κοινή μνήμη)

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

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

Διάλεξη 16-17: Πολυμορφισμός (Polymorphism) Διδάσκων: Παναγιώτης Ανδρέου

ΣΕΜΙΝΑΡΙΟ JAVA. 5 η ιάλεξη

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

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

(Διαφάνειες Νίκου Βιδάκη)

Πανεπιστήμιο Πειραιώς Τμήμα Πληροφορικής

Πληροφορική & Τηλεπικοινωνίες Υλοποίηση Συστημάτων Βάσεων Δεδομένων - Χειμερινό Εξάμηνο Καθηγητής Δ. Γουνόπουλος

Προγραμματισμός Ταυτόχρονος Προγραμματισμός

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

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

Transcript:

Διάλεξη 4 Νήματα (Threads) στην Java Συγχρονισμός Εξωτερικές διεργασίες Collections & Generics Διαχείριση σφαλμάτων στην Java Διάλεξη 4 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο 2012-2013 1

Νήματα (Threads) στην Java Συγχρονισμός Εξωτερικές διεργασίες Collections & Generics Διαχείριση σφαλμάτων στην Java Διάλεξη 4 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο 2012-2013

Εισαγωγή στα νήματα Σε υπολογιστικά περιβάλλοντα εφαρμογές «ανταγωνίζονται» να αποκτήσουν την δυνατότητα πρόσβασης και εκτέλεσης στην CPU (concurrent programming). Δυο ειδών οντότητες εκτέλεσης συναντούμε συνήθως, τις διεργασίες (processes) και τα νήματα (threads). Διεργασίες Οι διεργασίες αποτελούν αυτόνομες εφαρμογές που διαθέτουν δικό τους memory space. Το εκάστοτε λειτουργικό σύστημα υποστηρίζει την ύπαρξη πόρων για την επικοινωνία μεταξύ διεργασιών (Inter Process Communication-ΙPC resources) στον ίδιο ή και σε διαφορετικούς υπολογιστές (πχ pipes, sockets ). Νήματα Μπορούν να χαρακτηριστούν και ως lightweight processes. Παρέχουν και αυτά ένα χώρο εκτέλεσης μόνο που η δημιουργία ενός thread απαιτεί λιγότερους πόρους να δεσμευτούν από το λειτουργικό σύστημα. Τα νήματα γεννώνται μέσα σε μια διεργασία. Συγκεκριμένα, μια διεργασία μπορεί να δημιουργήσει ένα ή περισσότερα νήματα ώστε να εκτελέσει πολλά tasks «ταυτόχρονα». Τα νήματα μοιράζονται πόρους της διεργασίας που τα δημιουργεί όπως μνήμη, αρχεία κλπ αλλά διαθέτουν και το δικό τους address space. Η αλλαγή στην προσπέλαση της CPU μεταξύ threads είναι λιγότερο χρονοβόρα (context switching) σε σχέση με τις διεργασίες. 3

Τα νήματα στην Java (1/2) H Java μας παρέχει δυο τρόπους για την δημιουργία νημάτων Με το να κάνουμε extend την κλάση Thread (java.lang.thread) Με το να κάνουμε implement το Runnable interface (java.lang.runnable) Extends Thread Μια κλάση μπορεί να κάνει extend την Thread και να κάνει override την μέθοδο run() με σκοπό να ορίσει τα βήματα εκτέλεσης ενός thread. (Να σημειώσουμε πως η Thread κάνει implement το Runnable Interface) O constructor της κλάσης αυτής μπορεί να καλέσει τον constructor της Thread ρητά με χρήση της super(). Η κλάση μας κληρονομεί την μέθοδο start() που ορίζεται στην κλάση Thread και με την κλήση της από ένα αντικείμενο μπορεί να ξεκινήσει την εκτέλεση του ένα νέο thread. 4

Τα νήματα στην Java (2/2) Implements Runnable Μια κλάση μπορεί να κάνει implement το interface Runnable αρκεί να γραφτεί κώδικας για την μέθοδο run() που θα οριζει τον κύκλο ζωής ενός thread. Ακολούθως, ένα αντικείμενο τύπου Thread δημιουργείται και του περνάμε σαν όρισμα στον constructor του ένα αντικείμενο από την κλάση που δημιουργήσαμε και κάνει implement το Runnable. Η μέθοδος start() του αντικειμένου τύπου Thread καλείται και επιστρέφει μόλις γεννηθεί το thread Συνίσταται η χρήση threads που κάνουν implement το Runnable interface αντί να κληρωνομούν την Thread Class: 1. Αν κάνoυμε extend την Thread, τότε δεν μπορούμε να κάνουμε extend καμία άλλη κλάση 2. To Runnable interface μας υπαγορεύει να κάνουμε implement μόνο μια μέθοδο (την run) και αποφεύγουμε να κληρονομήσουμε 5 extra overhead της Thread.

Κύκλος ζωής ενός thread Start: είναι η κατάσταση στην οποία δημιουργούμε ένα αντικείμενο τύπου Thread και λίγο πριν καλέσουμε την start() Runnable (Ready-to-run): Είναι η στιγμή που καλείται η start() και από εδώ ξεκινά η ζωή ενός thread. Σε αυτή την κατάσταση περιμένει πρόσβαση στην CPU. Ακόμη, σε αυτή την κατάσταση μπορούμε να μεταπέσουμε από τις non-runnable και running Running: Σε αυτή την κατάσταση το thread εκτελείται. Ο scheduler το επιλέγει μέσα από την runnable pool. Dead: Το thread σε αυτή την κατάσταση παύει να εκτελεί και γίνεται join από την διεργασία που το δημιούργησε. Non-runnable state: Kλήση της static: void sleep(long millisecond) throws InterruptedException Περιμένει notification από άλλο thread: final void wait() throws InterruptedException To thread περιμένει για I/O πόρους Περιμένει τον τερματισμό ενός άλλου thread για να τερματίσει (joint completion) Περιμένει μέχρι να κάνει lock κάποιο πόρο. 6

Static μέθοδος που τυπώνει το όνομα του thread που την κάλεσαι και το μήνυμα που δέχεται ως παράμετρο Σε περίπτωση που το thread λάβει interrupt από κάποιο άλλο thread Η run ορίζει τον κύκλο ζωής του thread To αντικείμενο t τύπου Thread μας παρέχει μεθόδους για να χειριστούμε το thread που γεννήσαμε H main εκτός από διεργασία αποτελεί και thread και μπορεί να καλέσει την threadmessage

Νήματα (Threads) στην Java Συγχρονισμός Εξωτερικές διεργασίες Collections & Generics Διαχείριση σφαλμάτων στην Java Διάλεξη 4 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο 2012-2013

Συγχρονισμός Ζητήματα ασυνέπειας δεδομένων προκύπτουν όταν ένα σύνολο από threads διαμοιράζονται κοινή μνήμη και η πρόσβαση σε αυτή δεν γίνεται συγχρονισμένα. start() thread1 thread2 Shared object Η Java μας παρέχει την μεθοδολογία για να πετύχουμε συγχρονισμό στην πρόσβαση ενός κοινού πόρου. Μεγάλη προσοχή πρέπει να δίνουμε όχι μόνο στο να σχεδιάσουμε σωστά την ελεγχόμενη πρόσβαση, αλλά και την αποφυγή καταστάσεων όπως deadlocks και starvation. 9

Συγχρονισμός και μέθοδοι Ορίζουμε ως synchronized τις μεθόδους της κλάσης. Κάθε φορά ένα νήμα θα έχει πρόσβαση σε οποιαδήποτε synchronized μέθοδο ενός δεδομένου αντικειμένου, μπλοκάροντας οποιαδήποτε άλλη κλήση τόσο στην ίδια όσο και στις υπόλοιπες synchronized μεθόδους. Η λειτουργία του synchronized βασίζεται στην ύπαρξη ενός intrinsic lock που διαθέτει το αντικείμενο Ορίζουμε σαν διαμοιραζόμενο πόρο το αντικείμενο t Δημιουργούμε δυο νήματα που ζητούν πρόσβαση στο αντικείμενο μέσα από τις μεθόδους του. Το πρόβλημα που μπορεί να προκύψει από αυτή τη σχεδίαση είναι να προκληθούν φαινόμενα starvation, μιας και απαγορεύουμε την πρόσβαση στον διαμοιραζόμενο πόρο για όλη τη διάρκεια της κλήσης μιας synchronized μεθοδου. Το νήμα 2 είναι σε κατάσταση BLOCKED

Συγχρονισμός και block εντολών Στην περίπτωση των synchronized statements πρέπει να δηλώσουμε ως προς ποιό αντικείμενο πάμε να κάνουμε lock. Fine-grained συγχρονισμός. Επικεντρωνόμαστε στον διαμοιραζόμενο πόρο και δεν μπλοκάρουμε την λειτουργία για όλη τη διάρκεια εκτέλεσης της μεθοδου 11

Συγχρονισμός με χρήση αντικειμένων Ορισμός αντικειμένων με αποκλειστική χρήση για τον συγχρονισμό διαφορετικών πόρων Η πρόσβαση στον ένα πόρο δεν αποκλείει την ταυτόχρονη προσπέλαση του άλλου 12

Ατομική Εκτέλεση (Atomic execution) Ατομική πράξη εκτέλεσης (Atomic action) ορίζουμε την πράξη που εκτελείται επιτυχώς και με τη μια. Δεν μπορεί να σταματήσει στη μέση. Είτε εκτελείται ολόκληρη ή καθόλου. Ακόμα και απλές πράξεις μπορεί να μην είναι ατομικές λόγω του ότι αποσυντίθενται σε επιμέρους (χωρίς να καταλαβαίνει ο χρήστης). Παράδειγμα: double d; d++; Retrieve the current value of d. Increment the retrieved value by 1. Store the incremented value back in d. Παρόλα αυτά οι παρακάτω πράξεις είναι ατομικές: Για primitive variables (εκτος long, double) και references, οι πράξεις read/write ειναι ατομικές. Για όλες τις μεταβλητές που ορίζονται ως volatile (πτητικές) (εδώ συμπεριλαμβάνονται οι long, double). Οι αλλαγές που κάνουμε σε volatile variables είναι αμέσως οράτες σε άλλα νήματα. Ορίζοντας κάτι volatile δεν σημαίνει ότι εξασφαλίζουμε συγχρονισμό!!! 13

Νήματα (Threads) στην Java Συγχρονισμός Εξωτερικές διεργασίες Collections & Generics Διαχείριση σφαλμάτων στην Java Διάλεξη 4 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο 2012-2013

Εξωτερικές διεργασίες Η Java σχεδιάστηκε με σκοπό να παρέχει στις εφαρμογές ανεξαρτησία από το περιβάλλον εκτέλεσης. Όμως, υπάρχουν περιπτώσεις που θέλουμε να εκτελέσουμε μια εφαρμογή που να σχετίζεται με το λειτουργικό σύστημα που βρισκόμαστε. Η μεθοδολογία που ακολουθούμε είναι να δημιουργούμε μια νέα διεργασία μέσα στην εφαρμοφή μας που θα εκτελεί platform dependent ενέργειες. Η κλάση Runtime αποτελεί μια διεπαφή με το περιβάλλον που τρέχει η εφαρμογή μας getruntime(): μας επιστρέφει ένα αντικείμενο τύπου Runtime για την ίδια μας την εφαρμογή exec(string[] cmdandαrgs): δημιουργεί νέα διεργασία που εκτελεί την εντολή με παραμέτρους που της περνάμε σαν όρισμα Process p = Runtime.getRuntime().exec("/bin/ls"); Προσοχή!! Η java ανακατευθύνει τα stdin, stdout, stderr. Για να αλληλεπιδράσουμε με την διεργασία πρέπει να χρησιμοποιήσουμε τις μεθόδους getinputstream(), getoutputstream() και geterrorstream() που μας παρέχει το αντικείμενο τύπου Process. 15

Παράδειγμα Εκτελούμε την ls που βρίσκεται στον κατάλογο /bin Η getinputstream μας παρέχει πρόσβαση στο output stream της διεργασίας παιδιού. Τα δεδομένα αυτά αποτελούν input stream για την main Κάνουμε buffered το input stream και διαβάζουμε γραμμή-γραμμή τα δεδομένα Κλείνουμε πάντα τις ροές!! 16

Νήματα (Threads) στην Java Συγχρονισμός Εξωτερικές διεργασίες Collections & Generics Διαχείριση σφαλμάτων στην Java Διάλεξη 4 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο 2012-2013

Collections Ως Collections ορίζονται αντικείμενα που ομαδοποιούν άλλα αντικείμενα σε μια οντότητα. Τα Collections μας παρέχουν επιπλέον ένα framework για να αποθηκεύσουμε και να διαχειριστούμε τα αντικείμενα αυτά. Ένα collection framework περιλαμβάνει: Interfaces: διεπαφή για να χειριστούμε/προσπελαύνουμε με τον ίδιο τρόπο collections που διαθέτουν διαφορετικές λεπτομέριες υλοποίησης Κλάσεις: περιλαμβάνουν υλοποιημένες κλάσεις των Interfaces. Συνιστούν βιβλιοθήκη για τις εφαρμογές μας. Αλγορίθμους: αλγόριθμοι όπως η αναζήτηση, ταξινόμηση αντικειμένων υλοποιούνται με διαφορετικό τρόπο ως μέθοδοι των διαφόρων κλάσεων. Οι αλγόριθμοι αυτοί είναι πολυμορφικοί μιας και η ίδια μέθοδος διαφέρει ανάλογα με το collection interface. Μερικά από τα χαρακτηριστικά και προτερήματα από την χρήση collection framework: Έτοιμος κώδικας για χρήση από τις εφαρμογές μας Data structures εμπλουτισμένα με αλγόριθμους για γρήγορη προσπέλαση Ενιαίο API για χρήση, ανεξάρτητο από τις λεπτομέριες υλοποίησης 18

Collection interfaces Διαφορετικά είδη collection interfaces συνιστούν μια ιεραρχία και καθορίζουν διαφορετικούς τύπους αποθήκευσης και χειρισμού αντικειμένων. Collection: είναι η ρίζα στην ιεραρχία των collections και δεν υλοποιείται από κάποια κλάση. Χρησιμοποιείται συνήθως για την επικοινωνία collections με γενικό τρόπο. Set: ορίζει μια συλογή στην οποία δεν μπορούν να υπάρχουν διπλότυπα αντικείμενα. List: συνιστά μια συλλογή από αντικείμενα που εμφανίζουν μια σειρά. Μπορούμε να προσπελάσουμε ένα αντικείμενο με χρήση κάποιου index. Queue: collection που εμφανίζει τις ιδιότητες της ουράς. Map: collection που αντιστοιχεί κάποιο αντικείμενο με ένα κλειδί. SortedSet: διαθέτει τις ίδιες ιδιότητες με το Set, μόνο που χειρίζεται τα αντικείμενα με σειρά. SortedMap: διαθέτει τις ίδιες ιδιότητες με το Map, καθώς επίσης τα κλειδιά είναι ταξινομημένα. 19

Collection implementation Η υλοποίηση των Collection interfaces μπορεί να γίνει με διαφορετικούς τρόπους. Οι υπάρχουσες κατηγορίες συνοψίζονται παρακάτω: General-purpose implementations σε αυτή την κατηγορία βρίσκουμε τις πιο συχνά χρησιμοποιούμενες κλάσεις για collections. Special-purpose implementations κλάσεις για ειδικό σκοπό εμφανίζονται στην κατηγορία αυτή που παρουσιάζουν πολλές φορές μη αποδοτική συμπεριφορά. Concurrent implementations η υλοποίηση που παρέχεται εξασφαλίζει την ταυτόχρονη προσπέλαση των αντικειμένων αυτής της κατηγορίας από πολυνηματικά περιβάλλοντα (java.util.concurrent package). Wrapper implementations χρησιμοποιούνται σε συνδυασμό με general-purpose υλοποιήσεις για να παρέχουν επιπλέον λειτουργικότητα. Convenience implementations collections που είναι σχεδιασμένα με static συμπεριφορά (πχ singleton sets). Abstract implementations παρέχουν abstract κλάσεις για custom υλοποίηση από τον χρήστη. Ποιο συχνή είναι η χρήση general-purpose implementations και συγκεκριμένα Set HashSet, TreeSet, LinkedHashSet List ArrayList, LinkedList Map HashMap, TreeMap, LinkedHashMap Κάθε μια από τις κλάσεις παρέχει υλοποίηση όλων των μεθόδων που έχουν συμφωνηθεί στο interface. Δεν είναι thread-safe. Παρέχουν iterators για προσπέλαση στοιχείων. Είναι Serializable και υποστηρίζουν την clone(). 20

Προσπέλαση ενός Collection Υπάρχουν δυο τρόποι για να προσπελάσει κανείς κάποιο collection αντικείμενο, και κατά συνέπεια τα στοιχεία που το αποτελούν, ανεξάρτητα από τις λεπτομέρειες υλοποίησης: Με χρήση της δομής ελέγχου for-each Με χρήση Iterator. Η δομή ελέγχου for-each μας επιτρέπει να προσπελάσουμε με συνέπεια το σύνολο των στοιχείων ενός collection (ή ενός πίνακα array). for (Object o : collection) System.out.println(o); Ο Iterator είναι ένα interface που μας δίνει μεθόδους για να προσπελάσουμε ένα collection καθώς και να διαγράψουμε στοιχεία του. Κάθε Collection υλοποιεί τη μέθοδο iterator() μας επιστρέφει ένα αντικείμενο τύπου Iterator. public interface Iterator<E> { boolean hasnext(); E next(); void remove(); //optional } static void filter(collection<?> c) { for (Iterator<?> it = c.iterator(); it.hasnext(); ) if (!cond(it.next())) it.remove(); } Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο 2012-2013 21

Άλλα χρήσιμα χαρακτηριστικά... Bulk operations containsall(): ελέγχουμε αν ένα collection περιέχει όλα τα στοιχεία ενός άλλου. addall(): «συνενώνει» δυο collections. removeall(): διώχνει τα στοιχεία από ένα collection που εμφανίζονται σε ένα άλλο (διαφορά συνόλων). retainall(): η αντίστροφη διαδικασία από το removeall. Clear(): αδειάζουμε ένα collection από τα στοιχεία του. size() Μας επιστρέφει το πλήθος των στοιχείων που διατηρεί το collection toarray() Μέθοδος που μας επιτρέπει να μετατρέψουμε τα στοιχεία ενός collection σε πίνακα από αντικείμενα Collection<String> c Object[] a = c.toarray(); ή και String[] a = (String[]) c.toarray(new String[c.size()]); 22

Generics Χαρακτηριστικό που εμφανίστηκε στην Java SE 5. Μας παρέχει type-safety at compile time και κατά συνέπεια να αποφεύγουμε τον κίνδυνο για ClassCastException κατά την εκτέλεση. Τα generics είναι άμεσα συνδεδεμένα με την χρήση Collections. List myintlist = new LinkedList(); myintlist.add(new Integer(0)); Integer x = (Integer) myintlist.iterator().next(); List<Integer> myintlist = new LinkedList<Integer>(); myintlist.add(new Integer(0)); Integer x = myintlist.iterator().next(); Πως δουλεύει ο compiler με την ύπαρξη generics (Type Erasure) Σβήνει τα generics για να μείνουν raw types, για παράδειγμα ArrayList<String> ArrayList. Εισάγει type casting στα κατάλληλα σημεία μέσα στον κώδικα. Τα generics μας παρέχουν μια ευχέρια για το συντακτικό της γλώσσας και δεν κρατούν πληροφορίες για τον τύπο αντικειμένων κατά την διάρκεια της εκτέλεσης. 23

Η χρήση των Generics μέσα από παραδείγματα Set setofrawtype = new HashSet<String>(); setofrawtype = new HashSet<Integer>(); Set<Object> setofanytype = new HashSet<Object>(); setofanytype.add("abc"); setofanytype.add(new Float(3.0f)); Set<?> setofunknowntype = new LinkedHashSet<String>(); setofunknowntype = new LinkedHashSet<Integer>(); Set<String> setofstring = new HashSet<String>(); setofstring = new LinkedHashSet<String>(); Set<Object> SetOfObject = new HashSet<String>(); //compiler error 24

Νήματα (Threads) στην Java Συγχρονισμός Εξωτερικές διεργασίες Collections & Generics Διαχείριση σφαλμάτων στην Java Διάλεξη 4 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο 2012-2013

Σφάλματα στην Java (1/2) Τα σφάλματα (Bugs) είναι το πλέον κοινότυπο πρόβλημα ενός προγράμματος Προγραμματιστικά λάθη Λάθη σχεδιασμού Λάθος είσοδος δεδομένων Αστοχία υλικού Μη ελεγχόμενοι, εξωγενείς παράγοντες Κάθε προγραμματιστής πρέπει να διαχειρίζεται τις καταστάσεις: Στην C: Κάθε συνάρτηση γυρνά κάποια τιμή ενώ παράλληλα η perror τυπώνει το σφάλμα που συνέβη. Στην Java: Χρήση εξαιρέσεων (exceptions). Υπάρχουν δύο είδη, οι ελεγχόμενες εξαιρέσεις (checked) και μη ελεγχόμενες (unchecked). Διάλεξη 4 26 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο 2012-2013

Σφάλματα στην Java (2/2) Κατά την εκτέλεση ενός προγράμματος όταν συμβεί σφάλμα σε κάποια συνάρτηση που εκτελείται, αυτή δημιουργεί ένα αντικείμενο (exception object) και το παραδίδει στο runtime system (κάνει throw ένα exception). Ένα exception αντικείμενο περιέχει πληροφορίες για το είδος του σφάλματος που συνέβει, την κατάσταση του προγράμματος μας τη στιγμή του exception κ.α... To runtime system ψάχνει για κάποιο handler ορισμένο από τον προγραμματιστή που διαχειρίζεται αυτό το σφάλμα (κάνει catch το exception). Η αναζήτηση ξεκινά ιεραρχικά από την τρέχουσα συνάρτηση που συνέβει το σφάλμα και φτάνει μέχρι την main. Throws exception Forwards exception method3() method2() Call stack trace Catch exception method1() main() Διάλεξη 4 Τμήμα Πληροφορικής και Τηλεπικοινωνιών 27 Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο 2012-2013

Κατηγορίες exceptions Η Java μας παρέχει τριών ειδών exceptions. Όλα έχουν ως υπερκλάση την java.lang.throwable Checked exceptions: Error: Ορίζουν exceptional conditions όπου μια εφαρμογή θα πρέπει να κάνει recover. Υπόκεινται στο Catch or Specify Requirement, μιας και το πρόγραμμα μας θα πρέπει να διαθέτει handlers για να τα κάνει catch και να δώσει προς τον χρήστη κάποιο διαγνωστικό μήνυμα. Όλα τα exceptions θεωρούνται checked, εκτός από που ανήκουν στις κλάσεις Error, RunTimeException και τις αντίστοιχες υποκλάσεις τους Ορίζουν exceptional conditions που οφείλονται σε εξωτερικούς από την εφαρμογή παράγοντες και η εφαρμογή συνήθως δεν μπορεί να προβλέψει και να κάνει recover. Συνήθως οι λόγοι είναι αστοχία στο hardware. Δεν υπόκεινται στο Catch or Specify Requirement και το πιο πιθανό είναι να τυπωθεί το stack trace μέχρι το σημείο που συνέβει το exception και το πρόγραμμα μας να τερματίσει. Runtime exceptions/unchecked exceptions: Ορίζουν exceptional conditions που οφείλονται σε λογικά λάθη του προγραμματιστή. Το πιο δημοφηλές exception σε αυτή την κατηγορία είναι το NullPointerException!! Δεν υπόκεινται στο Catch or Specify Requirement και ανήκουν στην κλάση RunTimeException Διάλεξη 4 28 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο 2012-2013

Exception handler Εάν δεν θέλουμε να διαχειριστούμε κάποιο/α ExceptionType, τότε εισάγουμε στο header της εκάστοτε συνάρτησης την δήλωση throw ExceptionType Η Java μας παρέχει τρία exception handler components. Τα try, catch, και finally blocks μας επιτρέπουν να ορίσουμε τον δικό μας exception handler. try { code } catch (ExceptionType name) { System.err.println(...);... } catch (ExceptionType name) { System.err.println(...);... } finally {... } Περικλύω μέσα στο try block κομμάτι της εφαρμογής μου που υπάρχει πιθανότητα να γίνει throw ένα exception. Κάθε catch block ορίζει έναν exception handler, για ένα δεδομένο τύπο exception. Συνήθως τυπώνουν διαγνωστικό μήνυμα προς το χρήστη. Το finally block εκτελείται πάντα, είτε συμβεί exception είτε όχι. Συνήθως γράφουμε σ αυτό clean up κώδικα. 29

Η ανώτερη ιεραρχικά κλάση διαχειρίζεται και τα 2 πιθανά σφάλματα. Το σφάλμα θα το διαχειριστεί η καλούσα μέθοδος. Γιατί θα έχουμε πρόβλημα εδώ; Χρήση 2 διαδοχικών exceptions για να καλύψουμε τις περιπτώσεις απώλειας του αρχείου και σφάλματος εγγραφής. Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο 2012-2013 30

Διαχειριζόμαστε το exception όπως το ζητά η αντίστοιχη μέθοδος. Η χρήση του stack trace που μας δίνει κάθε exception επιτρέπει την αποσφαλμάτωση του προγράμματός μας. Η διαδικασία είναι η εξής: 1. Αναζητούμε την πρώτη δικιά μας κλήση που δημιούργησε πρόβλημα (από πάνω προς τα κάτω). 2. Ανατρέχουμε στην αντίστοιχη γραμμή του κώδικά μας. Το σημείο αυτό έχει πρόβλημα. 3. Ανάλογα με το πρόβλημα ελέγχουμε την είσοδο ή την έξοδο της εντολής. Σφάλμα στην γραμμή 53! Μπορούσε να μην εμφανιστεί αν δεν ζητούσαμε εκτύπωση. Σφάλμα στην γραμμή 58! Προέρχεται από λάθος κλήση στην γραμμή 38. Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο 2012-2013 31

Αποσφαλμάτωση με χρήση Exceptions - Πλεονεκτήματα Η κλάση exceptions προσφέρει την δυνατότητα εκτύπωσης των κλήσεων που οδήγησαν στο συγκεκριμένο σφάλμα Μέθοδος printstacktrace(); Τυπώνονται οι διαδοχικές κλήσεις μεθόδων που οδήγησαν στο συγκεκριμένο σφάλμα. ΔΕΝ ΕΙΝΑΙ ΚΑΛΗ ΠΡΑΚΤΙΚΗ: Να χρησιμοποιείται η ανώτερη ιεραρχικά κλάση για την διαχείριση όλων των σφαλμάτων (δηλαδή η Exception). Να τοποθετείται throws στην μέθοδο main. Μερικά από τα προτερήματα που μας παρέχει η χρήση exceptions: Διαχωρισμός του κώδικα που κάνει exception handling από τον κώδικα της εφαρμογής μας. Διαχείρηση ενός exception υψηλότερα στο call stack, απλά με την χρήση της δήλωσης throws. Κατηγοριοποίηση και χειρισμός των exceptions σε ομάδες λόγω της ύπαρξης ιεραρχίας κλάσεων (πχ τα exceptions FileNotFoundException και InterruptedIOException μπορούν να αντικατασταθούν από το IOException) Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο 2012-2013 32