Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

Διάλεξη 4 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο 2015-2016 1 Ροές Δεδομένων Χρήσιμα interfaces - Serializable, Comparable.

Παρόμοιες παρουσιάσεις


Παρουσίαση με θέμα: "Διάλεξη 4 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο 2015-2016 1 Ροές Δεδομένων Χρήσιμα interfaces - Serializable, Comparable."— Μεταγράφημα παρουσίασης:

1 Διάλεξη 4 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Ροές Δεδομένων Χρήσιμα interfaces - Serializable, Comparable Properties & NetworkInterface Regular expressions Singleton Pattern Producer-Consumer problem

2 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο  Ροές Δεδομένων  Χρήσιμα interfaces - Serializable, Comparable  Properties & NetworkInterface  Regular expressions  Singleton Pattern  Producer-Consumer problem 2 Διάλεξη 4

3 Ροές - Γενικά  Μια ροή είναι είτε μια πηγή είτε ένας προορισμός από bytes.  Η πηγή και ο προορισμός των ροών περιλαμβάνει αρχεία στο δίσκο, συσκευές, άλλα προγράμματα...  Δύο βασικές κατηγορίες Ροές εισόδου: μπορείτε μόνο να διαβάσετε Ροές εξόδου: μπορείτε μόνο να γράψετε  Η Java υποστηρίζει ένα σύνολο από τύπους δεδομένων που περνούν σαν ροές όπως bytes, primitive τύπους δεδομένων, αντικείμενα.  Μερικές ροές απλά περνούν δεδομένα από την πηγή στον προορισμό. Άλλες τα μετασχηματίζουν κατάλληλα και τα χρησιμοποιούν.  Η βιβλιοθήκη java.io περιλαβάνει όλες οι κλάσεις για τις ροές δεδομένων. Διάλεξη 4 3 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο MyProg Ροές εισόδου Ροές εξόδου

4 Ροές δεδομένων τύπου byte  Εκτελούν μεταφορά δεδομένων σε 8- bit bytes.  Η Java μας παρέχει τις κλάσεις InputStream και OutputStream και τις αντίστοιχες υποκλάσεις τους για να διαχειριστούμε ροές τύπου byte.  Οι ροές δεδομένων για αρχεία ανήκουν στην κατηγορία των byte streams.  Σημείωση: ΔΕΝ χρησιμοποιούμε τα byte streams κατευθείαν, διότι παρέχουν Ι/Ο λειτουργικότητα πολύ χαμηλού επιπέδου.  Όλες οι άλλες πιο πολύπλοκες ροές βασίζονται στα byte streams. import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class ExampleBytes { public static void main(String[] args) throws IOException { FileInputStream in = null; FileOutputStream out = null; try { in = new FileInputStream("test.txt"); out = new FileOutputStream(”output.txt"); int c; while ((c = in.read()) != -1) { out.write(c); } } finally { if (in != null) { in.close(); } if (out != null) { out.close(); } Διάλεξη 4 4 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Είναι σημαντικό να κλείνουμε τις ροές δεδομένων όταν δεν τις χρειαζόμαστε άλλο. Η finally μας το εγγυάται.

5 Ροές χαρακτήρων  Η Java χρησιμοποιεί Unicode για την αναπαράσταση συμβολοσειρών και χαρακτήρων.  Οι ρόες χαρακτήρων είναι 16-bit εκδόσεις των byte streams που επιτρέπουν την αντίστοιχη αντιμετώπιση στους χαρακτήρες.  Ένα πρόγραμμα που χρησιμοποιεί ροές χαρακτήρων αντί για ροές bytes μετατρέπει αυτόματα τα δεδομένα εισόδου/εξόδου στην τοπική αναπαράσταση.  Οι ρόες χαρακτήρων κληρονομούν τις κλάσεις Reader και Writer.  Για χειρισμό αρχείων, οι ροές χαρακτήρων που χρησιμοποιούνται είναι οι FileReader και FileWriter. import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; public class ExampleCharacters { public static void main(String[] args) throws IOException { FileReader inputStream = null; FileWriter outputStream = null; try { inputStream = new FileReader(”test.txt"); outputStream = new FileWriter(”output.txt"); int c; while ((c = inputStream.read()) != -1) { outputStream.write(c); } } finally { if (inputStream != null) { inputStream.close(); } if (outputStream != null) { outputStream.close(); } Διάλεξη 4 5 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο

6 Διασύνδεση ροών τύπου byte και ροών χαρακτήρων  Οι ροές χαρακτήρων μπορούν να χαρακτηριστούν και σαν wrappers για ροές τύπου byte. H FileReader χρησιμοποιεί την FileInputStream και η FileWriter την FileOutputStream αντίστοιχα.  Η Java παρέχει δύο κλάσεις γενικού σκοπού για τη διασύνδεση των ροών τύπου byte και των ροών χαρακτήρων, όπου δεν υπάρχει.  InputStreamReader και OutputStreamWriter χρησιμοποιούνται για να δημιουργήσουν ροές χαρακτήρων όταν δεν υπάρχουν έτοιμες ροές τύπου byte που να σας εξυπηρετούν.  Παράδειγμα χρήσης των κλάσεων αυτών είναι στη διαχείριση εισόδου/εξόδου με τη χρήση sockets! Διάλεξη 4 6 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο

7 Ροές δεδομένων με ενδιάμεση μνήμη  Οι πράξεις εισόδου/εξόδου είναι πιο αποδοτικές όταν γίνονται σε μεγάλα τμήματα δεδομένων, μιας και η προσπέλαση στο δίσκο γίνεται για μεγαλύτερο όγκο δεδομένων.  Οι ροές δεδομένων με ενδιάμεση μνήμη προσφέρουν αυτή τη δυνατότητα.  Οι ροές δεδομένων με ενδιάμεση μνήμη χρησιμοποιούν τις ροές τύπου byte ή τις ροές χαρακτήρων.  Οι κλάσεις BufferedInputStream και BufferedOutputStream χειρίζονται ροές bytes με ενδιάμεση μνήμη.  Οι κλάσεις BufferedReader και BufferedWriter χειρίζονται ροές χαρακτήρων με ενδιάμεση μνήμη. import java.io.FileReader; import java.io.FileWriter; import java.io.BufferedReader; import java.io.PrintWriter; import java.io.IOException; public class ExampleLines { public static void main(String[] args) throws IOException { BufferedReader inputStream = null; BufferedWriter outputStream = null; try { inputStream = new BufferedReader(new FileReader(”test.txt")); outputStream = new BufferedWriter(new FileWriter(”output.txt")); String l; while ((l = inputStream.readLine()) != null) { outputStream.write(l); } } finally { if (inputStream != null) { inputStream.close(); } if (outputStream != null) { outputStream.close(); } Διάλεξη 4 7 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο wrapping

8 Είδοδος/έξοδος από/προς το χρήστη  Βασική είσοδος: System.in  Βασική έξοδος: System.out  Βασική έξοδος λαθών: System.err  Σημείωση: Οι ροές System.out και System.err έχουν οριστεί σαν αντικείμενα τύπου PrintStream, με αποτέλεσμα να παρέχουν τη λειτουργικότητα μιας ροής χαρακτήρων. Η ροή System.in είναι μια ροή τύπου byte και δεν παρέχει τη λειτουργικότητα μιας ροής χαρακτήρων. Για να γίνει αυτό χρησιμοποιείστε στην κλάση InputStreamReader. InputStreamReader in = new InputStreamReader(System.in); Διάλεξη 4 8 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο

9 Ροές δεδομένων τύπου data  Χρησιμοποιούνται για είσοδο/έξοδο των βασικών τύπων δεδομένων της Java (boolean, char, byte, short, int, long, float, double) καθώς και String.  DataInputStream, DataOutputStream  Οι ρόες αυτές βασίζονται σε υπάρχουσες ροές τύπου byte/χαρακτήρων Data typeOutput methodInput methodSample value doubleDataOutputStream.writeDoubleDataOutputStream.readDouble55.45 intDataOutputStream.writeInt 11 StringDataOutputStream.writeString “Hello” DataInputStream in = new DataInputStream(new BufferedInputStream(new FileInputStream(aFile))); DataOutputStream out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(aFile))); Διάλεξη 4 9 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο

10 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Διάλεξη 4  Ροές Δεδομένων  Χρήσιμα interfaces Serializable, Comparable  Properties & NetworkInterface  Regular expressions  Singleton Pattern  Producer-Consumer problem

11 Serializable  H Java παρέχει έναν μηχανισμό έτσι ώστε να μετατρέπει ένα αντικείμενο σε μια ακολουθία από bytes (object serialization).  Από την στιγμή που ένα αντικείμενο γραφτεί σε ένα αρχείο, μπορεί να διαβαστεί και να ξαναφτιαχτεί σαν αντικείμενο στην μνήμη (deserialized).  Οι κλάσεις ObjectInputStream και ObjectOutputStream παρέχουν μεθόδους κατάλληλες για το serializing and deserializing ενός αντικειμένου.  ObjectOutputStream: public final void writeObject(Object x) throws IOException: κάνει serialize ένα αντικείμενο και το στέλνει στο output stream.  ObjectInputStream: public final Object readObject() throws IOException, ClassNotFoundException: διαβάζει το επόμενο αντικείμενο από το input stream και το μετατρέπει σε αντικείμενο. Επειδή επιστρέφει Object πρεπει να γίνει το κατάλληλο type casting  Ιδιαίτερα σημαντικό είναι το γεγονός ότι ένα αντικείμενο μπορεί να γίνει serialized σε μια πλατφόρμα και deserialized ώστε να ανακτηθεί από μια άλλη. Διάλεξη 4 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο

12  Για να επιτύχουμε ένα αντικείμενο μιας κλάσης να γίνει serialized θα πρέπει: Η κλάση να κάνει implement το interface java.io.Serializable. Όλα τα πεδία της κλάσης να είναι serializable. Εάν όχι, τότε πρέπει να γίνουν marked ως transient. Η ArrayList κάνει Implement το Serializable Κάνουμε serialize τη λίστα και τη στέλνουμε στο αρχείο person.txt Διαβάζουμε το person.txt και τα περιεχόμενα του τα μετατρέπουμε σαν μια λίστα από αντικείμενα

13 Comparable  Τα Collections υλοποιούν την ταξινόμηση αντικειμένων μέσα από την μέθοδο Collections.sort().  Το ερώτημα είναι πως μπορώ να συγκρίνω αντικείμενα μιας κλάσης ώστε να μπορώ να τα ταξινομήσω?  Ένα σύνολο κλάσεων όπως η String, Number (μαζί με τις υποκλάσεις της), Date κάνουν implement το interface Comparable και υλοποιούν με τον δικό τους τρόπο την μοναδική μέθοδο compareTo() που διαθέτει.  Η compareTo() συγκρίνει το αντικείμενο που την καλεί με το αντικείμενο που δεχεται σαν παράμετρο και επιστρέφει έναν αρνητικό, μηδέν ή θετικό ακέραιο ανάλογα αν η παράμετρος ήταν μικρότερη, ίση ή μεγαλύτερη από το τρέχον αντικείμενο. Διάλεξη 4Τμήμα Πληροφορικής και Τηλεπικοινωνίων Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο public interface Comparable { public int compareTo(T o); } 13

14 Παράδειγμα Διάλεξη 4Τμήμα Πληροφορικής και Τηλεπικοινωνίων Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Τι τυπώνει το πρόγραμμα? Θυμάστε την χρησιμότητα των μεθόδων equals() και toString()? 14 ΑΠΑΝΤΗΣH: Karl Ng, Tom Rich, Jeff Smith, John Smith Υλοποιούμε την δική μας compareTo() Η String διαθέτει την δικής της compareTo()

15 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Διάλεξη 4  Ροές Δεδομένων  Χρήσιμα interfaces Serializable, Comparable  Properties & NetworkInterface  Regular expressions  Singleton Pattern  Producer-Consumer problem

16 Properties  Στην Java χρησιμοποιούμε properties file για να αποθηκεύουμε configuration data.  Ένα τυπικό config.properties αρχείο μπορεί να περιέχει μέσα του dbuser=root dbpassword=root database=mysql  H Java μας παρέχει την κλάση Properties για να μπορούμε να διαβάζουμε properties αρχεία μέσα από ένα ορισμένο interface Διάλεξη 4Τμήμα Πληροφορικής και Τηλεπικοινωνίων Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο keyName=keyValue Properties prop = new Properties(); try { prop.load(new FileInputStream("config.properties")); System.out.println(prop.getProperty("database")); System.out.println(prop.getProperty("dbuser")); System.out.println(prop.getProperty("dbpassword")); } catch (IOException ex) { ex.printStackTrace(); } 16

17 Network interfaces  Τα network interfaces είναι οι διεπαφές του υπολογιστή μας με το δίκτυο.  Οι διεπαφές αυτές μπορεί να είναι φυσικές (κάρτα δικτύου) ή και λογισμικό που προσομοιώνει μια διεπαφή. Χαρακτηριστικό παράδειγμα αποτελεί το loopback (lo) με IP διεύθυνση  Μια φυσική διεπαφή μπορεί να διαμορφωθεί έτσι ώστε να περιλαμβάνει μια σειρά από sub-interfaces (λογικά interfaces). Με αυτό τον τρόπο πετυχαίνω ένα φυσικό interface να ανήκει σε πολλά υποδίκτυα και να διαθέτει πολλές IP ταυτόχρονα. Διάλεξη 4Τμήμα Πληροφορικής και Τηλεπικοινωνίων Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο #add subinterface and assign ip sudo ifconfig eth0: netmask #turn up the interface sudo ifconfig eth0:0 up #check!! ifconfig Για να μείνει το configuration μόνιμα, καταχωρούμε τα στοιχεία για το subinterface στο /etc/network/interfaces auto eth0:0 iface eth0:0 inet static address netmask

18 java.net.NetworkInterface  Η Java μας παρέχει την δυνατότητα μέσα από την κλάση NetworkInterface να μπορούμε να προσπελάσουμε τόσο ένα φυσικό network interface (μαζί με τα sub-interfaces του) όσο και το loopback.  Ακόμη, μπορούμε να ορίσουμε εμείς ρητά ποιό interface θα χρησιμοποιηθεί για την αποστολή/λήψη δεδομένων μέσω socket σε μια client-server επικοινωνία.  Δεν περιέχει public constructors αλλά μέσα από ένα σύνολο static μεθόδων μπορώ να λάβω τα διαθέσιμα interfaces της συσκευής και να τα χειριστώ ανάλογα Διάλεξη 4Τμήμα Πληροφορικής και Τηλεπικοινωνίων Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Enumeration nets = NetworkInterface.getNetworkInterfaces(); for (NetworkInterface netIf : Collections.list(nets)) { out.printf("Display name: %s\n", netIf.getDisplayName()); out.printf("Name: %s\n", netIf.getName()); Enumeration subIfs = netIf.getSubInterfaces(); for (NetworkInterface subIf : Collections.list(subIfs)) { out.printf("\tSub Interface Display name: %s\n", subIf.getDisplayName()); οut.printf("\tSub Interface Name: %s\n", subIf.getName()); } 18

19 Άλλες χρήσιμες μέθοδοι...  getInetAddresses(): επιστρέφει όλες τις IP διευθύνσεις που διαθέτει το interface.  getInterfaceAddresses(): μια λίστα από IP address, subnet mask και broadcast address για το συγκεκριμένο interface.  isUP(): ελέγχει άν ένα interface είναι up.  isLoopback(): ελέγχει αν το δεδομένο interface είναι loopback interface.  isPointToPoint(): ελέγχει αν το δεδομένο interface είναι point-to-point interface.  isVirtual(): ελέγχει αν το δεδομένο interface είναι virtual interface (sub-interface). Διάλεξη 4Τμήμα Πληροφορικής και Τηλεπικοινωνίων Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο

20 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Διάλεξη 4  Ροές Δεδομένων  Χρήσιμα interfaces Serializable, Comparable  Properties & NetworkInterface  Regular expressions  Singleton Pattern  Producer-Consumer problem

21 Regular Expressions  Είναι ένας τρόπος για να ορίσω και να αναζητήσω patterns μέσα σε κείμενο (ή String).  Παραδείγματα χρήσης regular expressions που έχουμε συναντήσει: grep, sed, awk...  Στην Java η βιβλιοθήκη java.util.regex μας παρέχει 3 κλάσεις για να ορίσουμε και να χειριστούμε regular expressions: Pattern, Matcher και PatternSyntaxException. Η κλάση Pattern μας βοηθά να δημιουργήσουμε αντικείμενα που περιέχουν μέσα τους ένα pattern ορισμένο από τον χρήστη. Μέσα από τις static μεθόδους που έχουν οριστεί, δίνουμε σαν όρισμα ένα pattern και μας επιστρέφει ένα αντικείμενο τύπου Pattern. Η κλάση Matcher μας βοηθά στο να δημιουργήσουμε αντικείμενα που μεταφράζουν τα patterns και να τα αναζητήσουν μέσα σε ένα κείμενο (ή και string). Η κλάση PatternSyntaxException ορίζει το exception που μπορεί να υπάρξει από την χρήση regular expressions. Ανήκει στην κατηγορία των unchecked exceptions και υποδηλώνει πως κάποιο σφάλαμα υπήρξε στην σύνταξη ενός regular expression pattern. Διάλεξη 4Τμήμα Πληροφορικής και Τηλεπικοινωνίων Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο

22 Διαβάζουμε από το πληκτρολόγιο το Pattern που θα ορίσει ο χρήστης και δημιουργούμε αντικείμενο τύπου Pattern Διαβάζουμε από το πληκτρολόγιο το κείμενο όπου θα κάνουμε match το pattern Όσο το αντικείμενο matcher βρίσκει patterns μέσα στο κείμενο μας Τυπώνει το string του κειμένου που ταυτίζεται με το pattern Τυπώνει τα σημεία που ξεκινά και τελειώνει το pattern στην συγκεκριμένη επανάληψη Enter your regex: foo Enter input string to search: foofoofoo I found the text foo starting at index 0 and ending at index 3. I found the text foo starting at index 3 and ending at index 6. I found the text foo starting at index 6 and ending at index 9.

23 Regular Expression Constructs (1/5)  Character Classes: δεν είναι κλάση!! Αποτελεί ένα τρόπο να δημιουργήσουμε patterns από χαρακτήρες μέσα σε []. Διάλεξη 4Τμήμα Πληροφορικής και Τηλεπικοινωνίων Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Enter your regex: [bcr]at Enter input string to search: bat I found the text "bat" starting at index 0 and ending at index 3. Enter your regex: [bcr]at Enter input string to search: hat No match found. 23

24 Regular Expression Constructs (2/5)  Predefined Character Classes: μας παρέχει την δυνατότητα εισαγωγής συντομεύσεων στα patterns. Διάλεξη 4Τμήμα Πληροφορικής και Τηλεπικοινωνίων Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Enter your regex: \d Enter input string to search: 1 I found the text "1" starting at index 0 and ending at index 1. Enter your regex: [bcr]at Enter your regex: \D Enter input string to search: 1 No match found. 24

25 Regular Expression Constructs (3/5)  Quantifiers: μας δίνει την δυνατότητα να εισάγουμε πληθικότητα στις εμφανίσεις των συμβόλων. Διάλεξη 4Τμήμα Πληροφορικής και Τηλεπικοινωνίων Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Enter your regex: a? Enter input string to search: aaaaa I found the text "a" starting at index 0 and ending at index 1. I found the text "a" starting at index 1 and ending at index 2. I found the text "a" starting at index 2 and ending at index 3. I found the text "a" starting at index 3 and ending at index 4. I found the text "a" starting at index 4 and ending at index 5. I found the text "" starting at index 5 and ending at index Enter your regex: a* Enter input string to search: aaaaa I found the text "aaaaa" starting at index 0 and ending at index 5. I found the text "" starting at index 5 and ending at index 5. Enter your regex: a+ Enter input string to search: aaaaa I found the text "aaaaa" starting at index 0 and ending at index 5.

26 Regular Expression Constructs (4/5)  Capturing Groups: ορίζει ένα σύνολο χαρακτήρων σαν αδιαίρετο group μέσα σε ().  Εφαρμόζεται σε συνδιασμό με τα προηγούμενα constructs που έχουμε συναντήσει. Διάλεξη 4Τμήμα Πληροφορικής και Τηλεπικοινωνίων Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Enter your regex: (dog){3} Enter input string to search: dogdogdogdogdogdog I found the text "dogdogdog" starting at index 0 and ending at index 9. I found the text "dogdogdog" starting at index 9 and ending at index 18. Enter your regex: dog{3} Enter input string to search: dogdogdogdogdogdog No match found. Enter your regex: [abc]{3} Enter input string to search: abccabaaaccbbbc I found the text "abc" starting at index 0 and ending at index 3. I found the text "cab" starting at index 3 and ending at index 6. I found the text "aaa" starting at index 6 and ending at index 9. I found the text "ccb" starting at index 9 and ending at index 12. I found the text "bbc" starting at index 12 and ending at index

27 Regular Expression Constructs (5/5)  Boundary matchers: θέτουν χαρακτηριστικά θέσης που θα βρίσκεται το pattern μέσα στο κείμενο. Διάλεξη 4Τμήμα Πληροφορικής και Τηλεπικοινωνίων Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Enter your regex: ^dog$ Enter input string to search: dog I found the text "dog" starting at index 0 and ending at index 3. Enter your regex: ^dog$ Enter input string to search: dog No match found. Enter your regex: \s*dog$ Enter input string to search: dog I found the text “ dog" starting at index 0 and ending at index Enter your regex: ^dog\w* Enter input string to search: dogblahblah I found the text "dogblahblah" starting at index 0 and ending at index 11.

28 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Διάλεξη 4  Ροές Δεδομένων  Χρήσιμα interfaces Serializable, Comparable  Properties & NetworkInterface  Regular expressions  Singleton Pattern  Producer-Consumer problem

29 Singleton Pattern  H Java παρέχει ένα σύνολο από μεθόδους για την αποδοτική σχεδίαση κώδικα (Design Patterns).  Η πιο δημοφιλής από αυτές είναι και η Singleton Pattern και αφορά στην δημιουργία μοναδικών αντικειμένων μιας κλάσης. Διάλεξη 4Τμήμα Πληροφορικής και Τηλεπικοινωνίων Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Private constructor. Κανείς δεν μπορεί να φτιάξει αντικείμενο για αυτήν την κλάση! Μόνο στην πρώτη κλήση θα δημιουργηθεί αντικείμενο τύπου Singleton. Με το synchronized αποφεύγουμε να υπάρξουν 2 threads για την αρχικοποίηση Κάνουμε override την clone() και πετάμε exception στην περίπτωση που πάμε να δημιουργήσουμε με κλώνο δεύτερο αντικείμενο To μοναδικό αντικείμενο της κλάσης

30 Ερωτήσεις  Μπορεί μια κλάση που υλοποιεί Singleton Design Pattern να κληρονομηθεί;  Πότε δημιουργείται το αντικείμενο της κλάσης;  Μπορείτε να σκεφτείται περιπτώσεις χρήσης της Singleton Design Pattern;  Έχετε συναντήσει παράδειγμα singleton κλάσης στο Java API;  Ποιό είναι το λάθος στον ακόλουθο κώδικα; Διάλεξη 4Τμήμα Πληροφορικής και Τηλεπικοινωνίων Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Όχι καθώς ο constructor της ορίζεται ως private Όταν θέλω να αρχικοποιήσω παραμέτρους για την εφαρμογή μου μόνο μια φορά. Όταν θέλω να έχω ένα πόρο που να τον μοιράζονται όλα τα threads της εφαρμογής μου Την πρώτη φορά που θα κληθεί η getInstance() java.lang.Runtime public static Singleton getInstance() { synchronized(this) { if (instance == null) instance = new Singleton(); } return instance; }

31 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο Διάλεξη 4  Ροές Δεδομένων  Χρήσιμα interfaces Serializable, Comparable  Properties & NetworkInterface  Regular expressions  Producer-Consumer problem

32 Producer-Consumer problem  Προβλήματα συγχρονισμού όπως το producer-consumer πρόβλημα, απαιτούν πέρα από συγχρονισμένη προσπέλαση σε έναν κοινό πόρο, πρόβλεψη και αποφυγή φαινομένων όπως το polling.  Χαρακτηριστικό παράδειγμα είναι η περίπτωση όπου δυο threads διαμοιράζονται έναν κοινό πόρο (πχ ένα buffer). Ο ρόλος του ενός thread είναι να εισάγει (γράφει) δεδομένα (producer) και του άλλου να διαβάζει (consumer).  Σε αυτή την περίπτωση δεν αρκεί μόνο ο συγχρονισμός αλλά απαιτείται και έλεγχος συνθηκών.  Μια κακή προσέγγιση στη λύση αυτού του προβλήματος υπαγορεύει σε κάθε έναν από τους δυο να κάνει busy waiting μέχρι να στείλει/λάβει κάποια ενημέρωση (CPU waste, polling).  Η λύση που δίνει η Java στο πρόβλημα αυτό είναι μέσα από τις final μεθόδους της κλάσης Object wait(), notify(), notifyAll(). Διάλεξη 2Τμήμα Πληροφορικής και Τηλεπικοινωνίων Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο

33 Διαμοιραζόμενος πόρος Κάθε φορά ένα thread θα καλεί μία από τις μεθόδους του q, μπλοκάρεται παράλληλα η κλήση της άλλης Ο producer αυξάνει συνεχώς το πεδίο n του q O consumer θέλει να βλέπει μοναχά τα updates!! Μια ενδεικτική εκτέλεση Put: 1 Got: 1 Got: 1 Got: 1 Got: 1 Got: 1 Put: 2 Put: 3 Put: 4 Put: 5 Put: 6 Put: 7 Got: 7

34 Μια ενδεικτική εκτέλεση Put: 1 Got: 1 Put: 2 Got: 2 Put: 3 Got: 3 Put: 4 Got: 4 Put: 5 Got: 5 H wait() κάνει το τρέχον thread να ελευθερώσει το lock του αντικειμένου q και να κάνει sleep μέχρι κάποιο άλλο thread της στείλει notify() Η notify() ξυπνά το πρώτο thread που κάλεσε το wait() του αντικειμένου q. Εναλλακτική είναι η χρήση της notifyAll()


Κατέβασμα ppt "Διάλεξη 4 Τμήμα Πληροφορικής και Τηλεπικοινωνιών Ανάπτυξη Λογισμικού Χειμερινό Εξάμηνο 2015-2016 1 Ροές Δεδομένων Χρήσιμα interfaces - Serializable, Comparable."

Παρόμοιες παρουσιάσεις


Διαφημίσεις Google