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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Αρχές Τεχνολογίας Λογισμικού Εργαστήριο

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

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

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

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

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

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

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Μέθοδοι που επιστρέφουν αντικείμενα Deep and Shallow Copies

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

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

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

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

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

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

Θέτοντας και επιστρέφοντας την τιµή της προτεραιότητας διεργασίας

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

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

Δομές ελέγχου ροής προγράμματος

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

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

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

Βασικά της γλώσσας JAVA

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

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

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

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

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

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Έλεγχος ισότητας String Interning Αποαναφοροποίηση - dereferencing

Αντικείµενα. ηµιουργία και χρησιµοποίηση αντικειµένων. ηµιουργία αντικειµένων

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

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

Τμήμα Πολιτικών Μηχανικών και Μηχανικών Περιβάλλοντος ΠΠΜ 401: Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής, :00-10:00 π.μ.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

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

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

Κλάσεις. Κατηγορίες Αντικειµένων. Κλάσεις. Φυσικά Αντικείµενα. Χώρος = Οµάδα Φυσικών Αντικειµένων. Πρόγραµµα = Οµάδα

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

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

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

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

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ Αλγοριθμική και Προγραμματισμός

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

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

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

Μέθοδοι. Μέθοδοι ηµιουργοί, Υπερφόρτωση και Υπέρβαση Μεθόδων

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

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

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

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

Transcript:

Προγραµµατισµός ΙΙ Ηγλώσσααντικειµενοστραφούς προγραµµατισµού Java ιδάσκων ηµήτριος Κατσαρός, Ph.D. @ Τµ. Μηχανικών Η/Υ, Τηλεπικοινωνιών & ικτύων Πανεπιστήµιο Θεσσαλίας ιάλεξη 15η: 31/08/2006 1 Εισαγωγή στα Java Νήµατα Introduction to Java threads 2 Τι είναι ένα thread (1/9) Μια σειριακή ροή ελέγχου µέσα σε ένα πρόγραµµα Παρόµοια µε τασειριακά(ακολουθιακά) προγράµµατα Κάθε thread : Μια αρχή Ακολουθία εντολών Ένα τέλος Σε κάθε χρονική στιγµή κατά τη διάρκεια εκτέλεσης ενός thread ένα σηµείο εκτέλεσης Το thread από µόνο του δεν είναι πρόγραµµα δεν µπορεί να εκτελεστεί από µόνο του Το thread εκτελείται µέσα σε ένα πρόγραµµα 3 1

Τι είναι ένα thread (2/9) Thread == lightweight process == πλαίσιο εκτέλεσης Παρόµοια µε µια real process : καιοιδυοαποτελούνµια απλή σειριακή ροή ελέγχου Κάθε thread εκτελείται µέσα στο πλαίσιο ενός πλήρους προγράµµατος εκµεταλλεύεται τους πόρους που έχει δεσµεύσει το πρόγραµµααυτό Ως σειριακή ροή ελέγχου, κάθε thread πρέπει να έχει τους δικούς του πόρους µέσα στο πρόγραµµα πουεκτελείται π.χ. πρέπει να έχει τη δική του στοίβα εκτέλεσης και µετρητή προγράµµατος 4 Τι είναι ένα thread (3/9) Πρώιµες µέρες των υπολογιστών single tasking Εκτέλεση µιας process κάθε φορά Multitasking: Ικανότητα του υπολογιστή να εκτελεί πολλαπλές εργασίες ταυτόχρονα (π.χ., λειτουργικό σύστηµα) Multithreading: Επέκταση της έννοιας του multitasking Εµπλέκει πολλαπλά threads ελέγχου µέσα σε ένα πρόγραµµα Threads υποπρογράµµατα µέσα σε ένα πρόγραµµα 5 Τι είναι ένα thread (4/9) class MainIsRunInAThread { public static void main(string[] args) { // main() is run in a single thread System.out.println(Thread.currentThread()); for (int i = 0; i < 1000; i++) { System.out.println( i == +i); 6 2

Τι είναι ένα thread (5/9) Προηγούµενοαπλόπαράδειγµα: ΕπίδειξητηςχρήσηςενόςJava thread. Όταν ξεκινά η εφαρµογή Η VM εκτελεί τη µέθοδο main() µέσα στο Java thread Το παράδειγµα: Μετρά από 0 µέχρι 999 τυπώνοντας κάθε τιµή, µέσα στο thread αυτό Οπρογραµµατισµός µε µια απλή ακολουθία ελέγχου µερικές φορές είναι περιοριστικός για την παραγωγή χρήσιµου λογισµικού Π.χ., ένα λειτουργικό σύστηµα πουθαµπορούσε να εκτελέσει µόνο ένα πρόγραµµα κάθε φορά 7 Τι είναι ένα thread (6/9) class CountThreadTest extends Thread { int from, to; public CountThreadTest(int from, int to) { this.from = from; this.to = to; // the run() method is like main() for a thread public void run() { for (int i = from; i < to; i++) System.out.println( i == +i); 8 Τι είναι ένα thread (7/9) public static void main(string[] args) { // spawn 5 threads, each of which counts 200 numbers for (int i = 1; i < 5; i++) { CountThreadTest t=new CountThreadTest(i*200, (i+1)*200); // starting a thread will launch a separate sequence // of control and execute the run() method of the thread t.start(); // end class CountThreadTest 9 3

Τι είναι ένα thread (8/9) Τροποποίηση του προηγούµενου παραδείγµατος για να εκµεταλλευτούµε ταthreads Χρήση 5 διαφορετικών threads για µέτρηση από 0 µέχρι 999, κάθε ένα µετρά 200 αριθµούς Η VM ενεργοποιεί τη µέθοδο main() στοδικότηςthread Η main() κατόπιν ξεκινά 5 διαφορετικά threads για να εκτελέσει τη λειτουργία της µέτρησης main() Παράλληλα Java threads 0-199 200-399 400-599 600-799 800-999 10 Τι είναι ένα thread (9/9) Σηµείωση: Πολλαπλά threads µπορεί να εκτελούνται ταυτόχρονα. Από τεχνικής άποψης: ίσως δεν είναι αληθές Ακόµα καισήµερα, οι περισσότεροι υπολογιστές έχουν έναν επεξεργαστή τέτοιοι υπολογιστές µπορούν να εκτελούν το πολύ µια λειτουργία (task) κάθε χρονική στιγµή Σε συστήµατα µονού-επεξεργαστή, το Λειτουργικό Σύστηµα εναλλάσσεται συνεχώς µεταξύ διαφορετικών tasks και threads, επιτρέποντας κάθε ενεργή task ή thread να χρησιµοποιεί τη CPU για ένα µικρό ποσό του χρόνου 11 Java Threads Τα threads δεν είναι εφεύρεση της Java Use of Java threads no worry about which threading packages are available for the underlying platform or whether the OS supports kernel threads. Η VM µας αποµονώνει από τις λεπτοµέρειες του συστήµατος τις σχετικές µε ταthreads Το API της Java για threading είναι πανοµοιότυπο σε όλες τις υλοποιήσεις τις Java 12 4

ηµιουργία νέων Threads ηµιουργία και εκτέλεση ενός thread διαδικασία 2 βηµάτων: Ανάπτυξη του κώδικα που εκτελείται από το thread Ανάπτυξη του κώδικα που εκκινεί το thread Παρέχουµε µια µέθοδο που υλοποιεί την κύρια λογική του thread, την ονοµάζουµε πάνταrun() : public void run(); run() δεν είναι ιstatic method (όπως είναι η main()). Η main() είναι static επειδή µια εφαρµογή (application) πάντα ξεκινά µε µια µόνο µέθοδο main() Μια application µπορεί να έχει πολλά threads Η κύρια λογική για ένα thread συσχετίζεται µε ένααντικείµενο : το αντικείµενο Thread Παρέχουµε µια υλοποίηση για τη µέθοδο run() µε δυο τρόπους : Subclassing την κλάση Thread Υλοποίηση του interface Runnable 13 Subclassing την κλάση Thread (1/2) ηµιουργούµε µια υποκλάση της java.lang.thread (η ίδιαείναι αντικείµενο Runnable) και κάνουµε override την κενή µέθοδο run() public class SimpleThread exetnds Thread { public SimpleThread(String str) { super(str); public void run() { for (int i = 0; i < 3; i++) { System.out.println(i+ +getname()); try { sleep((long)math.random()*1000); catch (InterruptedException e) { System.out.println( DONE! +getname()); 14 Subclassing Thread (2/2) public class TwoThreadDemo { public static void main(string[] args) { new SimpleThread( Pass_HY556 ).start(); new SimpleThread( Fail_HY556 ).start(); Output : 0 Pass_HY556 0 Fail_HY556 1 Fail_HY556 1 Pass_HY556 2 Fail_HY556 DONE! Fail_HY556 2 Pass_HY556 DONE! Pass_HY556 15 5

Υλοποίηση του Runnable Καταστάσεις όπου δεν είναι βολικό να δηµιουργήσουµε υποκλάση της Thread Π.χ., προσθήκη µιας µεθόδου run() σε µια προϋπάρχουσα κλάση που δεν µπορεί να κληρονοµήσει από τη Thread Το Java threading API υποστηρίζει τη δοµή τηςthread-like οντότητας που είναι ένα interface : java.lang.runnable public class MyClass extends MySuperClass implements Runnable { public void run() { 16 Καταστάσεις ενός Thread (1/4) Java thread αναπαρίσταται από αντικείµενο Thread κύκλος ζωής NEW RUNNABLE NOT RUNNABLE DEAD 17 Καταστάσεις ενός Thread (2/4) NEW Όταν δηµιουργείται για πρώτη φορά ένα αντικείµενο Thread Το Thread δεν εκτελείται! RUNNABLE Όταν ενεργοποιείται η µέθοδος start() του Thread Το Thread είναι έτοιµο προς εκτέλεση Το Thread δεν είναι απαραίτητο ότι εκτελείται, αλλά είναι ζωντανό και µπορεί το σύστηµα νακατανείµει σ αυτό χρόνο τη CPU time, όταν φυσικά ή CPU είναι διαθέσιµη 18 6

Καταστάσεις ενός Thread (3/4) NOT RUNNABLE Το Thread είναι ζωντανό, αλλά δεν είναι προς εκτέλεση εν έχει κατανεµηθεί χρόνος στη CPU για το Thread Γεγονότα που προκαλούν αυτήν την κατάσταση: αναµονή για εκτέλεση λειτουργίας I/O, κλάση της µεθόδου sleep(), η wait(), ή suspend() DEAD Το Thread τερµατίζεται Συνήθως ή µέθοδος run() επιστρέφει Κλήση των µεθόδων stop(), ή destroy() Ένα νεκρό (dead) thread είναι µόνιµα dead. εν µπορούµε να επαναφέρουµε στη ζωή ένα νεκρό thread 19 Καταστάσεις ενός Thread (4/4) Σηµείωση: Όταν πεθαίνει ένα thread, όλοι οι πόροι που κατανάλωνε το thread, συµπεριλαµβανόµενου και του αντικειµένου Thread, γίνονται διαθέσιµοι προς ανάκτηση από τον garbage collector (εάν φυσικά, δεν χρησιµοποιούνται κάπου αλλού) Οι προγραµµατιστές είναι υπεύθυνοι για τον καθορισµό των πόρων του συστήµατος (π.χ., κλείσιµο των ανοιχτών αρχείων, κλείσιµο των γραφικών, κ.τ.λ.) όταν τερµατίζεται ένα thread εν απαιτείται καθαρισµός (cleanup) µετά το θάνατο ενός thread 20 Το Thread API (1/14) Constructors public Thread(); public Thread(Runnable target); public Thread(Runnable target, String name); public Thread(String name); public Thread(ThreadGroup group, Runnable target); public Thread(ThreadGroup group,runnable target,string name); public Thread(ThreadGroup group, String name); 21 7

Το Thread API (2/14) Constructors (συνέχεια) name είναι το (string) όνοµα που ανατίθεται στο thread. Εάν δεν καθορίσουµεέναόνοµα, το σύστηµα παράγει ένα µοναδικό όνοµα τηςµορφής Thread-N, N είναι µοναδικός ακέραιος target είναι το στιγµιότυπο Runnable τουοποίουη µέθοδος run() εκτελείται ως η µέθοδος main του thread group είναι το ThreadGroup στο οποίο θα προστεθεί το thread Σηµείωση: παρόλο που είναι πιθανό να κατανείµουµεένα thread µε χρήσητηςnew Thread(), αυτό δεν είναι χρήσιµο. Όταν κατασκευάζουµε απευθείαςέναthread (χωρίς subclassing), το αντικείµενο Thread απαιτεί ένα αντικείµενοστόχο Runnable, επειδή η κλάση Thread από µόνη της δεν περιέχει τη λογική της εφαρµογής µας 22 Το Thread API (3/14) Naming public final String getname(); public final void setname(string name); Τα ονόµατα είναι σηµαντικά επειδή παρέχουν στον προγραµµατιστή έναν χρήσιµο τρόπο να αναγνωρίζει τα threads κατά το debugging Ονοµατίζουµε έναthread µε τρόποώστεναµπορούµε να αναγνωρίζουµε εύκολα τον σκοπό ή τη λειτουργία του thread 23 Το Thread API (4/14) Starting και Stopping public void start(); public final void stop(); public final void stop(throwable obj); public void destroy(); // not implemented yet (even in v. 1.3) Πετάγεται µια exception όταν καλείται περισσότερες από µια φορές η start() για ένα thread Η stop() προκαλεί τον τερµατισµό τουthread µε πέταγµα µιας ThreadDeath exception στο thread. εν χρησιµοποιείται πλέον. Θα πρέπει να αντικαθίσταται µε κώδικα (π.χ., τροποποίηση κάποιων µεταβλητών) που σηµατοδοτούν ότι η run() θα πρέπει να επιστρέψει 24 8

Το Thread API (5/14) Scheduling και Priority Scheduling: µηχανισµός που χρησιµοποιείται για τον προσδιορισµό πώςσταrunnable threads ανατίθεται CPU χρόνος Scheduling: Preemptive: ο thread scheduler preempts (σταµατά) ένα thread που εκτελείται για να επιτρέψει άλλα threads να εκτελεστούν Nonpreemptive: ο thread scheduler ποτέ δεν διακόπτει ένα thread που εκτελείται; Βασίζεται στο thread που εκτελείται να δώσει τον έλεγχο της CPU (! Πείνα- starvation των άλλων threads) Preemptive: Time-sliced: ο scheduler αναθέτει µιαπερίοδοτουχρόνουγιατην οποία κάθε thread µπορεί να χρησιµοποιήσει τη CPU Nontime-sliced: ο scheduler χρησιµοποιεί κριτήρια για να προσδιορίσει πότε να κάνει preempt ένα thread, π.χ., I/O status 25 Το Thread API (6/14) Θέτοντας Thread Priority public final static int MAX_PRIORITY = 10; public final static int MIN_PRIORITY = 1; public final static int NORM_PRIORITY = 5; public final int getpriority(); public final void setpriority(int new_priority); Κάθε thread έχει µια priority (προτεραιότητα) Όταν δηµιουργείται ένα thread κληρονοµεί την προτεραιότητα του thread που το δηµιούργησε Συµβολικές σταθερές που αναπαριστούν την εµβέλεια από 1 µέχρι 10. Πετάγεται µια exception εάν επιχειρηθεί να θέσουµε τιµές priority εκτός της εµβέλειας 26 Το Thread API (7/14) Ξυπνώντας ένα Thread public void interrupt(); public static boolean interrupted(); public boolean isinterrupted(); Η interrupt() στέλνει ένα µήνυµα αφύπνισηςσεέναthread, προκαλώντας να πεταχτεί µια InterruptedException στο thread και θέτει µια σηµαία (flag) που µπορεί να ελεγχθεί από το εκτελούµενο thread Η interrupted() ελέγχει την interrupt κατάσταση του τρέχοντος thread και κάνει resets την interrupt status σε τιµή false Η isinterrupted() ελέγχει εάν αυτό το thread έχει διακοπεί. Η interrupt κατάσταση του thread παραµένει αµετάβλητη 27 9

Το Thread API (8/14) Suspending και Resuming την εκτέλεση ενός Thread public final void suspend(); public final void resume(); Η suspend() σταµατά ένα thread, επιβεβαιώνοντας ότι το thread δεν θα εκτελεστεί Η resume() αντιστρέφει την λειτουργία suspend() Μια κλήση της suspend() βάζει το thread στην κατάσταση NOT RUNNABLE Καλώντας την resume() δεν υπάρχει εγγύηση ότι το target στόχος θα γίνει RUNNABLE; Άλλα γεγονότα µπορεί να έχουν κάνει το thread να είναι NOT RUNNABLE ή ακόµα και DEAD 28 Το Thread API (9/14) Βάζοντας ένα Thread σε κατάσταση Sleep public static void sleep( long millisec ); public static void sleep( long millisec, int nanosec ); Κάνει το thread να κοιµηθεί για τον καθορισµένο αριθµό από milliseconds (+ τον καθορισµένο αριθµό nanoseconds). Κάνοντας ένα Thread να σταµατήσει public static void yield(); Κάνει το τρέχον εκτελούµενο thread να σταµατήσει προσωρινά και να επιτρέψει σε άλλα threads να εκτελεστούν 29 Το Thread API (10/14) Περιµένοντας ένα Thread να τερµατιστεί public final void join(); public final void join(long millisec); public final void join(long millisec, int nanosec); Η join() περιµένει για το thread αυτό µέχρι να πεθάνει (joining the thread) Οι join() µέθοδοι µε παραµέτρους χρόνου χρησιµοποιούνται γιανακαθορίσουµε timeouts; Εάν το thread δεν τερµατιστεί µέσα στο καθορισµένο χρονικό διάστηµα, η join() επιστρέφει ούτως ή άλλως 30 10

Το Thread API (11/14) Κατανοώντας Daemon Threads public final boolean isdaemon(); public final void setdaemon(boolean on); Τα background threads παρέχουν υπηρεσίες σε άλλα threads Όταν µόνο daemon threads παραµένουν ζωντανά, η Java VM διεργασία τερµατίζεται Garbage collection VM daemon thread, εκτελείται µόνο όταν δεν υπάρχει κάτι άλλο προς εκτέλεση Η µέθοδος setdaemon() θέτει την daemon status αυτού του thread Η isdaemon() επιστρέφει true εάν αυτό το thread είναι ένα daemon; Αλλιώς επιστρέφει false 31 Το Thread API (12/14) ιάφορες µέθοδοι για Thread public int countstackframes(); Επιστρέφει τον αριθµό τωνενεργώνstack frames (ενεργοποιήσεις µεθόδων) στη stack του thread Το thread πρέπει να γίνει suspend γιαναχρησιµοποιηθεί αυτή η µέθοδος suspend() deprecated countstackframes() deprecated. public final ThreadGroup getthreadgroup(); Επιστρέφει το ThreadGroup όπου ανήκει το thread Ένα thread είναι πάντα µέλος µιας απλής ThreadGroup κλάσης 32 Το Thread API (13/14) ιάφορες µέθοδοι για Thread public final boolean isalive(); Επιστρέφει true εάν το thread είναι RUNNABLE ή NOT RUNNABLE και false εάν το thread είναι NEW ή DEAD. public static Thread currentthread(); Επιστρέφει το αντικείµενο Thread για την τρέχουσα ακολουθία εκτέλεσης public static int activecount(); Επιστρέφει τον αριθµό τωνthreads στην τρέχουσα εκτελούµενη κλάση ThreadGroup 33 11

Το Thread API (14/14) ιάφορες µέθοδοι για Thread public static int enumerate(thread tarray[]); Επιστρέφει µια λάστα όλων των threads στην τρέχουσα κλάση ThreadGroup (µαζί µε ταsubgroups) public static void dumpstack(); Τυπώνει µια µέθοδο-µε-µέθοδο λίστα του stack trace για το τρέχον thread στο System.err ρεύµα εξόδου public String tostring(); Returns a string that describes this thread, including the thread's name, priority, and thread group. 34 Thread Groups (1/2) Κάθε Java thread ανήκει σε ένα στιγµιότυπο ThreadGroup Χρησιµοποιούνται για να βοηθήσουν στην οργάνωση παρόµοιων οµάδων από threads Τα ThreadGroups µπορεί να περιέχουν threads αλλά και άλλα groups (δενδρική δοµή) Το κορυφαίο thread group ονοµάζεται system 35 Thread Groups (2/2) system clock garbage collector MAIN main your group = ThreadGroup = Thread Thd 1 Thd 2 36 12

Τα ThreadGroup API (1/2) Constructors public ThreadGroup(String name); public ThreadGroup(ThreadGroup parent, String name); name είναι το όνοµα του νέου ThreadGroup parent είναι το πατρικό group του νέου ThreadGroup Ο constructor που δεν δέχεται την παράµετρο πατρικού group χρησιµοποιεί το group του τρέχοντος εκτελούµενου thread ως τον parent του νέου group Αρχικά το νέο αντικείµενο του ThreadGroup δεν περιέχει threads ή άλλα thread groups 37 Τα ThreadGroup API (2/2) Το API είναι παρόµοιο µε το Thread API Μέθοδοι που επηρεάζουν όλο το group των threads Π.χ., suspend, resume, stop, destroy όλα τα threads στο τρέχον group Μέθοδοι που επηρεάζουν µόνο τα χαρακτηριστικά του group Π.χ., θέτοντας priority για το τρέχον group Περισσότερες λεπτοµέρειες στο Java API 38 13