Φροντιστήριο Α' Κατανεμημένα Συστήματα Επιμέλεια: Μπούτσης Ιωάννης

Σχετικά έγγραφα
Φροντιστήριο Α' Κατανεμημένα Συστήματα Επιμέλεια: Μπούτσης Ιωάννης

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

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

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

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

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

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

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

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

Distributed Systems. Βάνα Καλογεράκη Τµήµα Πληροφορικής Οικονοµικό Πανεπιστήµιο Αθηνών. Lecture 3: Threads (Νήµατα) Distributed Systems

ιαδικτυακές Εφαρµογές

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

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

Εργαστήριο Java. Αντικείµενο: Δίκτυα. Χειρισµός URLs. Άσκηση 1. Lab11. Πακέτο java.net

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

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

Η Υλοποίηση της Επικοινωνίας. Κατανεµηµένα Συστήµατα

HY335 4ο Φροντιστήριο

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

ικτύωσησε Java Κατανεµηµένα Συστήµατα 08-1

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

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

Ντίρλης Νικόλαος- ΕΤΥ 3ο ΦΡΟΝΤΙΣΤΗΡΙΟ ΠΑΡΑΣΚΕΥΗ 25 ΟΚΤΩΒΡΙΟΥ 2013 ΑΙΘΟΥΣΑ Β4

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

(C) 2010 Pearson Education, Inc. All rights reserved.

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

{ πρωτόκολλο, τοπική-διεύθυνση, τοπική-διεργασία, απομακρυσμένη-διεύθυνση, απομακρυσμένη-διεργασία }

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

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

ιαδικτυακές Εφαρµογές Πραγµατικού Χρόνου µε Java

ΚΑΤΑΝΕΜΗΜΕΝΟ ΣΥΣΤΗΜΑ ΔΙΑΧΕΙΡΙΣΗΣ ΣΥΣΚΕΥΩΝ ΑΣΗΜΑΚΟΠΟΥΛΟΣ ΣΩΤΗΡΗΣ ΑΜ : 3021

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

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

Επίπεδο Μεταφοράς. (ανεβαίνουμε προς τα πάνω) Εργαστήριο Δικτύων Υπολογιστών Τμήμα Μηχανικών Η/Υ και Πληροφορικής

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

Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Διάλεξη #11 η : Διαδικτυακές Εφαρμογές με τη Java

Δίκτυα Επικοινωνιών ΙΙ: Network Programming UDP Sockets, Signals

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

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

ΗY335: Δίκτυα Υπολογιστών Χειμερινό Εξάμηνο Τμήμα Επιστήμης Υπολογιστών Πανεπιστήμιο Κρήτης Διδάσκουσα: Μαρία Παπαδοπούλη

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

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

Εγχειρίδιο Συναρτήσεων. Socket *sopen(const int type, const int protocol, const char *host, const char *service)

Αρχεία και Ρεύματα. Αρχεία

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

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

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

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

08 Πολυνηματικός προγραμματισμός στο JVM

Κατανεμημένα Συστήματα. Javascript LCR example

4 η ιάλεξη: Signals UDP Sockets

Εισαγωγή στον Κατανεμημένο Προγραμματισμό

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

ΕΙΣΟ ΟΣ-ΕΞΟ ΟΣ Ε ΟΜΕΝΩΝ

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

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

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

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

Ανάπτυξη δικτυακού παιχνιδιού με δυνατότητα συμμετοχής ακροατηρίου.

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

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

άσκηση Hide UI Elements 7.2 Try and Catch

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

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

ΥΛΟΠΟΙΗΣΗ ΠΡΟΤΥΠΩΝ ΕΠΙΚΟΙΝΩΝΙΑΣ ΜΕ ΤΗ ΒΙΒΛΙΟΘΗΚΗ JAVA.NET ΣΤΑ ΠΛΑΙΣΙΑ ΤΟΥ ΜΑΘΗΜΑΤΟΣ ΔΙΚΤΥΑ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΥ ΚΥΚΛΟΥ ΠΛΗΡΟΦΟΡΙΚΗΣ ΤΟΥ ΤΕΕ

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

Δημιουργία & Τερματισμός Διεργασιών. Προγραμματισμός II 1

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

Εργαστήριο ΔΙΕΡΓΑΣΙΕΣ - ΔΙΑΧΕΙΡΙΣΗ

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

Εργαστήριο Κατανεμημένων Συστημάτων

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

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

Remote Method Invocation (RMI)

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

50 Ketseo,Theoni Sarif,Omar 104

ΠΛΗΡΟΦΟΡΙΚΗ ΙI Ενότητα 12: Ροές και είσοδος/έξοδος αρχείων

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

ΜΕΤΑΦΟΡΑ ΑΡΧΕΙΩΝ FTP

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

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

Γαβαλάς Δαμιανός

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Στοιχειώδεις Δοµές Δεδοµένων Δοµικά Στοιχεία και Πίνακες Κεφάλαιο 3 (3.1 και 3.2) Ε. Μαρκάκης Επικ. Καθηγητής

Διεργασίες (Processes)

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

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

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

Dr. Garmpis Aristogiannis - EPDO TEI Messolonghi

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

ΕΠΛ233 Βασικά στοιχεία προγραµµατισµού στη JAVA

Εισαγωγή στον Προγραμματισμό

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

Λιβανός Γιώργος Εξάμηνο 2017Β

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

ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ. Παράδοση Ασκήσεων Κεφάλαιο 2 Ασκήσεις 3,6,8,9,15,22,24,26. Γεωργόπουλος Άλκης Α.Μ.: 39 Κοντογιώργης Αναστάσιος A.M.

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

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

Λειτουργικά Συστήματα. Εισαγωγή

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

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

Transcript:

Φροντιστήριο Α' Κατανεμημένα Συστήματα 2011-2012 Επιμέλεια: Μπούτσης Ιωάννης mpoutsis@aueb.gr

Outline Επικοινωνία μέσω Java Sockets(υποδοχές) Παραλληλοποιημένος κώδικας: Threads(νήματα) Παραδείγματα

Εισαγωγή Sockets Δικτυακή επικοινωνία χαμηλού επιπέδου Σε client-server εφαρμογές: Ο server παρέχει κάποια υπηρεσία Ο client χρησιμοποιεί αυτή την υπηρεσία (πχ. Εμφανιση δεδομένων ενός query σε ΒΔ) Ανάγκη για αξιόπιστη επικοινωνία: TCP TCP: παρέχει ένα αξιόπιστο, point-to-point επικοινωνιακό κανάλι το οποίο χρησιμοποιούν οι εφαρμογές client-server στο Internet για να επικοινωνήσουν.

Τι είναι το socket? Ο Server δεσμεύει ένα socket με συγκεκριμένο IP / port. Περιμένει και ακούει σε αυτή τη θύρα για αιτήσεις σύνδεσης. Client-side: Ο client ξέρει την IP / port στην οποία ακούει ο server και προσπαθεί να συνδεθεί αυτόν. Ο Client πρέπει να ορίσει τον εαυτό του: δεσμεύει ένα local port το οποίο χρησιμοποιεί στη διάρκεια της σύνδεσης (συνήθως δίνετε από το σύστημα). Μόλις γίνει το accept, o server δεσμεύει ένα νέο socket στην ίδια local port. Χρειαζόμαστε νέο socket για να μπορεί να συνεχίσει να ακούει στο αρχικό socket για αιτήσεις σύνδεσης. Ο client και ο server μπορούν τώρα να επικοινωνήσουν γράφοντας και διαβάζοντας από τα sockets τους.

Sockets Χρήση του πακέτου java.net Βασική τάξη Socket Throw: public Socket(InetAddress address, int port) public Socket(String host, int port) UnknownHostException, IOException

Επικοινωνία μέσω Sockets Unicast 1 to 1 Multicast Πχ. αποστολή αρχείου από ένα κόμβο σε έναν άλλο Σε well-known port για όλους τους κόμβους Χρησιμοποιούμε UDP socket Πχ. Για να βρούμε ένα bootstrap κόμβο

Client/Server Example ServerSocket s = new ServerSocket(5008); Ο server παρακολουθεί το port 5008 Ακούει για συνδέσεις σε αυτό το port Socket insock = s.accept(); Ο server μπλοκάρει Περιμένει να φτάσει μια σύνδεση από τον client

Client/Server Example Πώς επικοινωνούν οι απομακρυσμένες διεργασίες? Μέσω streams InputStream instr = insock.getinputstream(); Για να διαβάζουμε ότι στέλνεται από την άλλη πλευρά της σύνδεσης OutputStream outstr = insock.getoutputstream(); Για να στείλουμε στην άλλη πλευρά της σύνδεσης

void openserver() { ServerSocket providersocket = null; Socket connection = null; String message = null; providersocket = new ServerSocket(4321, 10); while (true) { // Wait for connection connection = providersocket.accept(); Server // get Input and Output streams ObjectOutputStream out = new ObjectOutputStream(connection.getOutputStream()); ObjectInputStream in = new ObjectInputStream(connection.getInputStream()); out.writeobject("connection successful!"); out.flush(); // The two parts communicate via the input and output streams do { message = (String) in.readobject(); System.out.println(connection.getInetAddress().getHostAddress() + ">" + message); catch (ClassNotFoundException classnot) { System.err.println("Data received in unknown format"); while (!message.equals("bye")); in.close(); out.close(); catch (IOException ioexception) { ioexception.printstacktrace(); finally { // Closing connection providersocket.close(); catch (IOException ioexception) { ioexception.printstacktrace();

Client void startclient() { Socket requestsocket = null; ObjectOutputStream out = null; ObjectInputStream in = null; String message; // 1. creating a socket to connect to the server requestsocket = new Socket("127.0.0.1", 4321); // 2. get Input and Output streams out = new ObjectOutputStream(requestSocket.getOutputStream()); in = new ObjectInputStream(requestSocket.getInputStream()); // 3: Communicating with the server message = (String) in.readobject(); System.out.println("Server>" + message); out.writeobject("hi! Testing.."); out.flush(); out.writeobject("bye"); out.flush(); catch (ClassNotFoundException classnot) { System.err.println("data received in unknown format"); catch (UnknownHostException unknownhost) { System.err.println("You are trying to connect to an unknown host!"); catch (IOException ioexception) { ioexception.printstacktrace(); finally { // 4: Closing connection in.close(); out.close(); requestsocket.close(); catch (IOException ioexception) { ioexception.printstacktrace();

Μόνο ένας client? Το πρόβλημα με το προηγούμενο παράδειγμα: Εξυπηρετεί ένα client κάθε φορά βάζοντας στην ουρά τους υπόλοιπους Χρειαζόμαστε παράλληλη επεξεργασία των clients Τι κάνουμε τότε? Θέτουμε maximum μέγεθος στην ουρά ServerSocket(8500, 100) Και εξυπηρετούμε κάθε αίτηση με ένα νέο Thread (αργότερα...)

Διανομή Δεδομένων στο δίκτυο Unicast: Multicast Broadcast Ένας στέλνει, ένας συγκεκριμένος λαμβάνει Ένας στέλνει, Πολλοί λαμβάνουν (ομάδα από παραλήπτες) Ένας στέλνει, όλοι λαμβάνουν Επίσης anycast, geocast κτλ.

Multicast Sniffer MulticastSocket ms = null; InetAddress ia = null; byte[] buffer = new byte[65535]; DatagramPacket dp = new DatagramPacket(buffer, buffer.length); // 224.0.0.0 to 239.255.255.255 String address = "225.5.5.10"; int port = 5000; ia = InetAddress.getByName(address); catch (UnknownHostException e) { System.err.println(e); ms = new MulticastSocket(port); ms.joingroup(ia); while (true) { ms.receive(dp); String s = new String(dp.getData(), 0, dp.getlength()); System.out.println(s); catch (SocketException se) { System.err.println(se); catch (IOException ie) { System.err.println(ie); finally { ms.close();

Multicast Sender InetAddress ia = null; byte[] buffer = new byte[65535]; DatagramPacket dp = new DatagramPacket(buffer, buffer.length); // 224.0.0.0 to 239.255.255.255 String address = "225.5.5.10"; int port = 5000; ia = InetAddress.getByName(address); catch (UnknownHostException e) { System.err.println(e); MulticastSocket ms = new MulticastSocket(); String temp = "Hi There"; byte[] data = temp.getbytes(); DatagramPacket datagrampacket = new DatagramPacket(data, data.length, ia, port); ms.send(datagrampacket); System.out.println("Sent!"); catch (SocketException se) { System.err.println(se); catch (IOException ie) { System.err.println(ie);

Threads Γνωστά και ως: lightweight process (LWP) Αποτελούνται από: stack, register program counter, thread id Μοιράζεται με άλλα threads στην διεργασία: code section, data open files, signals Three thread states: running, ready, blocked set, section, ίδια

Γιατί χρειαζόμαστε threads? Παράλληλη επεξεργασία πχ. web server: Threads για παράλληλη αποστολή αρχείων σε κάθε client Threads στη μεριά του server για να εξυπηρετεί πολλούς clients Γρήγορη επικοινωνία μέσω shared memory Χρήση όλως των διαθέσιμων επεξεργαστών Επίδοση λιγότερος χρόνος για create / destroy για thread σε σχέση με process

Challenges Συγχρονισμός μεταξύ των threads που μοιράζονται τους ίδιους πόρους Η ταυτόχρονη εκτέλεση μπορεί να δημιουργήσει δυσκολίες

Race condition And Concurrent access Ταυτόχρονη προσπέλαση κρίσιμων περιοχών από πλέον του ενός thread. Δε θέλουμε δυο ή και περισσότερα νήματα να ανανεώνουν μια κοινή δομή δεδομένων ή μεταβλητή ή αντικείμενο κ.τ.λ. Οι synchronized methods μπορούν να καλεστούν ταυτόχρονα από πολλά threads Μόνο ένα thread θα προσπελάσει τη μέθοδο κάθε φορά public synchronized void mymethod(){ someintvar++;

Java Threads Κάθε εφαρμογή ξεκινά με ένα νήμα Εκτελεί τη μέθοδο main της εφαρμογής Το νήμα αυτό μπορεί να δημιουργήσει άλλα Διάφοροι τρόποι διακοπής εκτέλεσης Αναμονή εισόδου / εξόδου Αναμονή χρονομέτρου (sleep) Αναμονή γεγονότος (wait) Προτεραιότητες νημάτων Κάθε νήμα έχει προτεραιότητα 1 (χαμηλή) έως 10 (υψηλή) Η προτεραιότητα κληρονομείται από τον γονέα Χρονοπρογραμματισμός ανάλογα με την προτεραιότητα Διακοπτόμενος ή μη διακοπτόμενος χρονοπρογραμματισμός

Java Threads Νήματα: υποστηρίζονται μέσω της τάξης Thread Thread (String όνομα_νήματος) Thread () void start() void run () Κατασκευάζει ένα νήμα με συγκεκριμένο όνομα Κατασκευάζει ένα νήμα με όνομα "Thread-#" Ξεκινά την εκτέλεση ενός νέου νήματος (μέθοδος run()) Τα δύο νήματα εκτελούνται παράλληλα Η μέθοδος που περιέχει τον κώδικα του νήματος Κάθε thread ορίζει τη δική της run() void setname (String όνομα) / String getname () Θέτει/επιστρέφει το όνομα του νήματος

Java Threads static Thread currentthread () Επιστρέφει μία αναφορά προς το εκτελούμενο νήμα void sleep (int διάστημα) void yield () Αποκοιμίζει το νήμα για διάστημα msec Παραχωρεί τον επεξεργαστή σε άλλα νήματα void interrupt () Στέλνει στο νήμα ένα σήμα διακοπής σ ένα νήμα Αν το νήμα είναι σε κοιμισμένο ή σε αναμονή ξυπνάει Αλλιώς το νήμα πρέπει να ελέγχει ρητά αν έχει λάβει διακοπές boolean isinterrupted () Επιστρέφει true αν το νήμα έχει διακοπεί

Java Threads boolean isalive () Επιστρέφει true αν το νήμα εκτελείται void setpriority (int προτεραιότητα) / int getpriority () Θέτει/επιστρέφει την προτεραιότητα του νήματος void join (long διάστημα) Περιμένει τον τερματισμό του νήματος για διάστημα msec Αν το διάστημα είναι 0, αναμονή για πάντα void join (): Ισοδύναμη με join(0) void checkaccess () Εξετάζει αν έχουμε πρόσβαση στο νήμα Εξαίρεση αν δεν έχουμε, επιστροφή αν έχουμε Χρήσιμη για εκσφαλμάτωση εφαρμογών

Java Threads ThreadGroup getthreadgroup () Επιστρέφει την ομάδα του νήματος int activecount () Επιστρέφει το πλήθος ενεργών νημάτων της ομάδας int enumerate (Thread[] πίνακας) Αντιγράφει κάθε ενεργό νήμα της ομάδας στον πίνακα Αν ο πίνακας είναι μικρός, δεν αποθηκεύονται όλα String tostring () Επιστρέφει όνομα, προτεραιότητα και ομάδα του νήματος void dumpstack () Εμφανίζει τη στοίβα κλήσεων των μεθόδων του νήματος Χρήσιμη για εκσφαλμάτωση εφαρμογών

Thread Example public class mythread extends Thread { String input; public mythread(string input) { this.input = input; public void run() { for (int i = 0; i < 5; i++) { System.out.println(i + ":\t" + input); sleep((int) (Math.random() * 1000)); catch (InterruptedException e) { public static void main(string[] args) { Thread t = new mythread("distributed"); t.start(); Thread t2 = new mythread("systems"); t2.start(); /* PROSOXH OXI: t = new mythread("distributed"); t.run(); t2 = new mythread("systems"); t2.run();*/

Runnable public class mythreadrunnable implements Runnable { String input; public mythreadrunnable(string input) { this.input = input; public void run() { for (int i = 0; i < 5; i++) { System.out.println(i + ":\t" + input); Thread.sleep((int) (Math.random() * 1000)); catch (InterruptedException e) { public static void main(string[] args) { mythreadrunnable t = new mythreadrunnable("distributed"); new Thread(t).start(); mythreadrunnable t2 = new mythreadrunnable("systems"); new Thread(t2).start(); OUTPUT: 0: Distributed 0: Systems 1: Distributed 1: Systems 2: Distributed 3: Distributed 2: Systems 4: Distributed 3: Systems 4: Systems

Server with Threads public class Provider { ServerSocket providersocket; Socket connection = null; ObjectOutputStream out; ObjectInputStream in; String message; Provider() { void openserver() { // creating a server socket providersocket = new ServerSocket(4321, 10); while (true) { // Wait for connection connection = providersocket.accept(); Thread t = new actionsforclients(connection); t.start(); catch (IOException ioexception) { ioexception.printstacktrace(); finally { // Closing connection providersocket.close(); catch (IOException ioexception) { ioexception.printstacktrace(); public class actionsforclients extends Thread { ObjectInputStream in; ObjectOutputStream out; public actionsforclients(socket connection) { out = new ObjectOutputStream(connection.getOutputStream()); in = new ObjectInputStream(connection.getInputStream()); catch (IOException e) { e.printstacktrace(); public void run() { int a = in.readint(); int b = in.readint(); out.writeint(a + b); out.flush(); catch (IOException e) { e.printstacktrace(); finally { in.close(); out.close(); catch (IOException ioexception) { ioexception.printstacktrace();

Client using thread public class Client extends Thread { int a, b; Client(int a, int b) { this.a = a; this.b = b; public void run() { Socket requestsocket = null; ObjectOutputStream out = null; ObjectInputStream in = null; requestsocket = new Socket("127.0.0.1", 4321); out = new ObjectOutputStream(requestSocket.getOutputStream()); in = new ObjectInputStream(requestSocket.getInputStream()); out.writeint(a); out.flush(); out.writeint(b); out.flush(); System.out.println("Server>" + in.readint()); catch (UnknownHostException unknownhost) { System.err.println("You are trying to connect to an unknown host!"); catch (IOException ioexception) { ioexception.printstacktrace(); finally { in.close(); out.close(); requestsocket.close(); catch (IOException ioexception) { ioexception.printstacktrace(); public static void main(string args[]) { new Client(10, 5).start(); new Client(20, 5).start(); new Client(30, 5).start(); new Client(40, 5).start(); new Client(50, 5).start(); new Client(60, 5).start(); new Client(70, 5).start(); new Client(80, 5).start(); new Client(90, 5).start(); new Client(100, 5).start(); Server>85 Server>95 Server>65 Server>105 Server>15 Server>55 Server>35 Server>45 Server>25 Server>75

Ερωτήσεις???