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



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Εκφωνήσεις ασκήσεων εργαστηρίου 2 (java threads)

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

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

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

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

Εργαστήριο 1-1 η Άσκηση - Ανάλυση

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

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

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

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

ΚΕΡΑΜΟΠΟΥΛΟΣ ΕΥΚΛΕΙΔΗΣ

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

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

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

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

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

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

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΕΙΣ ΓΛΩΣΣΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Ιανουάριος 2008 Οι απαντήσεις να είναι καθαρογραμμένες με ευδιάκριτους όλους του χαρακτήρες.

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Graphical User Interfaces (GUI) SWING

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

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

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

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

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

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

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

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

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

Παύλος Εφραιµίδης. Java. Κληρονοµικότητα

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

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

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

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

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

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

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

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

Σηματοφόροι (Σηματοφορείς) Ταυτόχρονος Προγραμματισμός 1

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

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

16. Multithreading (Java Applications)

Διασυνδέσεις / Διεπαφές. Παναγιώτης Σφέτσος, PhD

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

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

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

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

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

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

Dr. Garmpis Aristogiannis - EPDO TEI Messolonghi

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

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

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

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

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

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

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

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

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

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

Σηματοφόροι (Σηματοφορείς) Ταυτόχρονος Προγραμματισμός 1

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

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

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

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

Εαρινό. Ύλη εργαστηρίου, Ασκήσεις Java

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

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

(2) Thread Thread. Runnable. ( ) Java. Sample91. Thread Thread ) Thread. Runnable. run() / run() Runnnale ( ) MyRun implements Runnable Runnable

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

API: Applications Programming Interface

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

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

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

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

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Παράδειγμα χρήσης κληρονομικότητας

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

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

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

ημιουργία Γραφικού Περιβάλλοντος

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πολυμορφισμός Αφηρημένες κλάσεις Interfaces (διεπαφές)

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πολυμορφισμός Αφηρημένες κλάσεις Interfaces (διεπαφές)

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

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

Transcript:

Εργαστήριο Java Lab09 Αντικείμενο: Πολυνηματικές εφαρμογές Η χρήση περισσότερων από μιας ροής εντολών μέσα σε ένα πρόγραμμα είναι γνωστή ως multithreading. H κάθε μια ροή εντολών μέσα στο πρόγραμμα ονομάζεται νήμα (thread). Ωστόσο κάθε νήμα δεν μπορεί να εκτελεστεί από μόνο του αλλά εκτελείται στο περιβάλλον ενός προγράμματος που το εκκινεί. Η Java είναι μοναδικό παράδειγμα γλώσσας ευρείας εφαρμογής η οποία δίνει την δυνατότητα στον προγραμματιστή να προγραμματίζει με χρήση νημάτων. H κλάση που χρησιμοποιείται για την δημιουργία νημάτων είναι η java.lang.thread η οποία παρέχει κώδικα για εκκίνηση νήματος, εκτέλεση νήματος και καθορισμό του εάν ένα νήμα είναι διαθέσιμο για εκτέλεση. Η σημαντικότερη μέθοδος ενός νήματος είναι η run η οποία: γίνεται override αν η κλάση μας κληρονομεί από την Thread ή υλοποιείται αν η κλάση μας υλοποιεί το Runnable interface. Ένα thread ξεκινά την εκτέλεσή του μέσα από ένα πρόγραμμα με μια κλήση στην μέθοδό του start η οποία με την σειρά της καλεί την run. Όταν η start εκκινήσει το thread το πρόγραμμα συνεχίζει την εκτέλεσή του με την αμέσως επόμενη εντολή μετά το start. Άλλες μέθοδοι εκτός από την start και την run είναι: interrupt Καλείται για να διακόψει ένα νήμα isinterrupted Εξετάζει αν ένα νήμα έχει διακοπεί. isalive Εξετάζει αν ένα νήμα έχει ολοκληρώσει την εκτέλεση της μεθόδου run ή όχι. setname, getname Θέτουν και επιστρέφουν αντίστοιχα το όνομα του νήματος. tostring Επιστρέφει ένα λεκτικό που αποτελείται από το όνομα του νήματος, την προτεραιότητά του και την ομάδα νημάτων στην οποία ανήκει. setpriority, getpriority Θέτουν και επιστρέφουν την προτεραιότητα ενός νήματος. Μερικές στατικές μέθοδοι της κλάσης Thread: sleep όταν καλείται το ενεργό Thread εισέρχεται στην κατάσταση sleeping από την οποία εξέρχεται όταν παρέλθει το χρονικό διάστημα που περνάει ως παράμετρος στην sleep ή εάν κληθεί η μέθοδος interrupt για το νήμα. Όταν εξέλθει από την κατάσταση sleep εισέρχεται στην κατάσταση ready currentthread επιστρέφει το νήμα το οποίο εκτελείται H Java χρησιμοποιεί τον εξής τρόπο για να επιλέξει το νήμα το οποίο πρόκειται να εκτελεστεί αν υπάρχουν πολλά που είναι διαθέσιμα: Κάθε νήμα έχει προτεραιότητα στα όρια από Thread.MIN_PRIORITY (1) έως Thread.MAX_PRIORITY (10). H προκαθορισμένη τιμή είναι Thread.NORM_PRIORITY (5). Ο χρονοπρογραμματιστής (scheduler) επιλέγει το νήμα με την μεγαλύτερη προτεραιότητα να εκτελεστεί πρώτο. Αν έχουν την ίδια προτεραιότητα επιλέγεται ένα στην τύχη. Καταστάσεις νημάτων ready running sleeping waiting dead blocked Όταν εκτελεστεί η start. Όταν ανατεθεί ο επεξεργαστής στο νήμα. Όταν καλείται η μέθοδος sleep στο νήμα που τρέχει. To νήμα περιμένει να περάσει ένα χρονικό διάστημα. Όταν συμβεί αυτό το νήμα μεταβαίνει στην κατάσταση ready. Όταν το νήμα που εκτελείται καλεί την wait για ένα αντικείμενο. Όταν η μέθοδος run ολοκληρώνεται ή τερματίζεται για κάποιο λόγο. Όταν το νήμα ζητά μια ενέργεια εισόδου / εξόδου. 1

Η κλάση Timer και η κλάση TimerTask Λόγω της πολυπλοκότητας που συνεπάγεται ο προγραμματισμός με νήματα είναι προτιμότερο να χρησιμοποιούμε κλήσεις υψηλού επιπέδου στο API της Java έτσι ώστε να λαμβάνουμε την συμπεριφορά που επιθυμούμε με τις κλάσεις java.lang.timer 1 και java.lang.timertask. Μέθοδοι της Timer schedule(timertask task, long delay, long period) schedule(timertask task, Date time, long period) scheduleatfixedrate(timertask task, long delay, long period) scheduleatfixedrate(timertask task, Date firsttime, long period) Άσκηση 1 Να κατασκευάσετε εφαρμογή η οποία να εμφανίζει με τυχαία σειρά κάποια προκαθορισμένα κείμενα σε ένα Label χρησιμοποιώντας ένα νήμα. Πατώντας ένα πλήκτρο να τερματίζεται το νήμα. Να γίνει υλοποίηση: α) με χρήση κλάσης που να κληρονομεί από την Thread. β) με δημιουργία κλάσης που να υλοποιεί το interface Runnable. γ) με χρήση των κλάσεων java.util.timer, java.util.timertask. ΛΥΣΗ Α' import java.awt.event.*; public class Lab09_1a extends JFrame{ String []messages={"επδο", "ΤΕΙ", "ΜΕΣΟΛΟΓΓΙΟΥ", "ΕΡΓΑΣΤΗΡΙΟ", "JAVA"; private TestThread t; private JLabel l1; private JButton b1; public Lab09_1a(){ super("threads"); Container c=getcontentpane(); l1=new JLabel("XXX"); c.add(l1,borderlayout.north); t=new TestThread(); t.start(); b1=new JButton("Τερματισμός thread"); b1.addactionlistener(new ActionListener() { public void actionperformed(actionevent e){ t.interrupt(); l1.settext("to νήμα τερματίστηκε"); System.err.println(t.toString()); ); c.add(b1,borderlayout.south); setsize(200,200); public static void main(string []args){ Lab09_1a a=new Lab09_1a(); //inner κλάση TestThread class TestThread extends Thread { public TestThread(){ super(); System.err.println("Thread Created!!!"); 1 ισχύει από την έκδοση 1.3 του JDK και μετά 2

while (true){ Thread.sleep(1000); int i=(int)(math.random()*messages.length); l1.settext(messages[i]); catch (InterruptedException ex){ System.err.println(ex.toString()); //Τέλος Inner κλάσης TestThread //Τέλος κλάσης Lab09_1a Λύση Β' Ειδικότερα σε αυτή την περίπτωση προκειμένου να δημιουργηθεί το thread θα πρέπει να δημιουργηθούν αντικείμενα της κλάσης Thread τα οποία θα λαμβάνουν ως παραμέτρους αναφορές στα αντικείμενα που υλοποιούν το interface. import java.awt.event.*; public class Lab09_1b extends JFrame implements Runnable{ String []messages={"επδο", "ΤΕΙ", "ΜΕΣΟΛΟΓΓΙΟΥ", "ΕΡΓΑΣΤΗΡΙΟ", "JAVA"; private Thread t; private JLabel l1; private JButton b1; public Lab09_1b(){ super("threads"); t=new Thread(this); t.start(); Container c=getcontentpane(); l1=new JLabel("Η εφαρμογή εκκινήθηκε"); c.add(l1,borderlayout.north); b1=new JButton("Τερματισμός thread"); b1.addactionlistener(new ActionListener() { public void actionperformed(actionevent e){ t.interrupt(); l1.settext("to νήμα τερματίστηκε"); System.err.println(t.toString()); ); c.add(b1,borderlayout.south); setsize(200,200); public static void main(string []args){ Lab09_1b a=new Lab09_1b (); while (true){ Thread.sleep(1000); int i=(int)(math.random()*messages.length); l1.settext(messages[i]); catch (InterruptedException ex){ System.err.println(ex.toString()); Λύση Γ' import java.util.timer; import java.util.timertask; import java.awt.event.*; 3

public class Lab09_1c extends JFrame{ String []messages={"επδο", "ΤΕΙ", "ΜΕΣΟΛΟΓΓΙΟΥ", "ΕΡΓΑΣΤΗΡΙΟ", "JAVA"; Timer timer; JLabel l1; JButton b1; public Lab09_1c() { super("threads"); Container c=getcontentpane(); l1=new JLabel("Η εφαρμογή εκκινήθηκε"); b1=new JButton("Τερματισμός thread"); b1.addactionlistener(new ActionListener(){ public void actionperformed(actionevent e){ timer.cancel(); l1.settext("to νήμα τερματίστηκε"); ); c.add(l1,borderlayout.north); c.add(b1,borderlayout.south); setsize(200,200); timer = new Timer(); timer.scheduleatfixedrate(new MessageTask(), 5000,1000); //θα ξεκινήσει μετά από 5000 msec και θα επεναλαμβάνεται κάθε 1000 msec public static void main(string args[]) { Lab09_1c a=new Lab09_1c(); //Εσωτερική κλάση MessageTask κληρονομεί από την TimerTask class MessageTask extends TimerTask { public void run() { int i=(int)(math.random()*messages.length); l1.settext(messages[i]); Άσκηση 2 Να κατασκευάσετε εφαρμογή που να εμφανίζει ένα κύκλο ο οποίος να μετακινείται από το ένα άκρο του παραθύρου μέχρι το άλλο και πάλι προς τα πίσω χρησιμοποιώντας ένα νήμα. public class Lab09_2 extends JFrame { Ball b1; public Lab09_2(){ super("πρώτο animation"); setsize(300,300); b1=new Ball(0,150,getSize()); b1.start(); public void paint(graphics g){ g.setcolor(color.white); g.fillrect(0,150,(int)getsize().getwidth(),20); g.setcolor(color.red); g.filloval(b1.getx(),b1.gety(),b1.getw(),b1.geth()); public static void main(string []args){ Lab09_2 a=new Lab09_2(); while (true){ a.repaint(); class Ball extends Thread { private Rectangle r; private int x_increment=1; 4

private Dimension bounds; public Ball(int x,int y, Dimension d){ r=new Rectangle(x,y,20,20); bounds=d; public int getx(){return r.x; public int gety(){return r.y; public int getw(){return r.width; public int geth(){return r.height; Thread thr; thr=thread.currentthread(); thr.setpriority(thread.min_priority); while (true) { r.x=r.x+x_increment; if (r.x+r.width>=bounds.width r.x<0) x_increment=-x_increment; try{ thr.sleep(20); catch (Exception e){ e.printstacktrace(); //while //run //Ball Συγχρονισμός Threads Τo τμήματα κώδικα που προσπελαύνουν το ίδιο αντικείμενο από νήματα που εκτελούνται ταυτόχρονα ονομάζονται κρίσιμες περιοχές. Στην Java η κρίσιμη περιοχή μπορεί να είναι μια μέθοδος ή ένα μπλοκ κώδικα το οποίο σημειώνεται με τη λέξη synchronized. Μία μέθοδος ενός thread που προσπελαύνει κοινά δεδομένα δηλώνεται με την δεσμευμένη λέξη synchronized. Όταν μια μέθοδος synchronized εκτελείται σε ένα αντικείμενο το αντικείμενο κλειδώνει έτσι ώστε να μην μπορεί να εκτελεστεί η ίδια ή άλλες synchronized μέθοδοι την ίδια στιγμή από άλλα νήματα στο ίδιο το αντικείμενο. Όταν η synchronized μέθοδος τελειώσει το αντικείμενο παύει να είναι πλέον κλειδωμένο και το νήμα με την μεγαλύτερη προτεραιότητα που είναι σε κατάσταση ready αναλαμβάνει να εκτελέσει την δική του κλήση στην synchronized μέθοδο. Ένα νήμα που εκτελεί την synchronized μέθοδό του μπορεί να "αποφασίσει" ότι δεν μπορεί να συνεχίσει οπότε καλεί τη μέθοδο wait. Ένα άλλο νήμα που εκτελείται μπορεί να κάνει notify (ή notifyall) στο νήμα που είναι σε κατάσταση wait έτσι ώστε να μεταβεί σε κατάσταση ready πάλι. Άσκηση 3 Να κατασκευάσετε μια εφαρμογή που να χρησιμοποιεί ένα νήμα Producer (παραγωγός) και ένα Consumer (καταναλωτής). Ο παραγωγός θα παράγει τους αριθμούς από 1 μέχρι το 9. Το άλλο νήμα θα καταναλώνει την τιμή μόλις παραχθεί και θα περιμένει να παραχθεί μια άλλη μέχρι να καταναλωθεί και ο τελευταίος αριθμός δηλαδή το 9. Να χρησιμοποιηθεί μια κλάση που να αντιπροσωπεύει το αντικείμενο το οποίο παράγεται και καταναλώνεται με μεθόδους set και get οι οποίες θα είναι synchronized. Κώδικας για την κλάση που "κρατά" τους παραγόμενους αριθμούς. public class SharedData { private int contents; private boolean available = false; public synchronized int get() { while (available == false) { wait(); catch (InterruptedException e) { available = false; 5

notifyall(); return contents; public synchronized void put(int value) { while (available == true) { wait(); catch (InterruptedException e) { contents = value; available = true; notifyall(); Κώδικας για τον παραγωγό public class Producer extends Thread { private SharedData sd; private int number; public Producer(SharedData sd, int number) { this.sd = sd; this.number = number; public void run() { for (int i = 0; i < 10; i++) { sd.put(i); System.out.println("Producer #" + this.number + " put: " + i); try{ sleep((int)(math.random() * 1000)); catch (InterruptedException e){ Κώδικας για τον καταναλωτή public class Consumer extends Thread { private SharedData sd; private int number; public Consumer(SharedData sd, int number) { this.sd = sd; this.number = number; int value = 0; do{ try{ Thread.sleep((int) (Math.random()*3000)); catch (InterruptedException ex){ System.err.println(ex.toString()); value = sd.get(); System.out.println("Consumer #" + this.number + " got: " + value); while (value!=9); Κύριο Πρόγραμμα public class Lab09_3 { public static void main(string[] args) { SharedData c = new SharedData(); Producer p1 = new Producer(c, 1); Consumer c1 = new Consumer(c, 1); p1.start(); c1.start(); 6