Κατέβασμα παρουσίασης
Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε
ΔημοσίευσεAlddes Pagonis Τροποποιήθηκε πριν 10 χρόνια
1
Κεφάλαιο 6 Threads
2
2 Στον παραδοσιακό προγραμματισμό όταν ένα πρόγραμμα εκτελείται ονομάζεται process (διεργασία) και οι εντολές του εκτελούνται σειριακά η μία μετά την άλλη μέχρι το τέλος του. Σ’ αυτή την περίπτωση μπορούμε να πούμε οτι το συγκεκριμένο process διαθέτει μόνο ένα thread που εκτελεί τις εντολές του προγράμματος. Στις multithreading γλώσσες προγραμματισμού μπορούμε να ορίσουμε κάποιο process να περιέχει ένα ή και περισσότερα threads (lightweight processes) οι οποίες εκτελούν κάθε μια ξεχωριστά τον κώδικα του προγράμματος. Είναι σαν να έχουμε πολλά processes που εκτελούνται παράλληλα μέσα στο αρχικό process.
3
3 Υλοποίηση των Threads (α΄ Τρόπος) Δημιουργία υποκλάσης της κλάσης Thread: Ενδείκνυται στις περιπτώσεις που η κλάση μας δεν απαιτείται να κληρονομήσει μεθόδους από κάποια κλάση πέραν της Thread. Στην υποκλάση της Thread ανατίθεται κώδικας προς εκτέλεση υπερκαλύπτοντας (override) τη μέθοδο run() της κλάσης Thread. To Thread συμπληρώνει τον κύκλο ζωής του όταν ολοκληρωθεί η εκτέλεση της μεθόδου run( ).
4
4 Μέθοδοι της κλάσης Thread run(): Εμπεριέχει τον κώδικα που εκτελείται υπό την επίβλεψη του thread. Δεν καλείται ποτέ άμεσα. Παρακάμπτεται από τον προγραμματιστή. start(): εκκινεί την εκτέλεση του κώδικα που εμπεριέχεται στη μέθοδο run() sleep(int t): αδρανοποιεί την εκτέλεση του Thread για t msec
5
5 Υλοποίηση των Threads (α΄ Τρόπος) Παράδειγμα class SimpleThread extends Thread { public SimpleThread(String str) { super(str); //Ανάθεση ονόματος στο τρέχον // Thread } public void run() { for (int i = 0; i < 10; i++) { System.out.println(i + " " + getName()); try { sleep((int)(Math.random() * 1000)); } catch (InterruptedException e) {} } System.out.println("DONE! " + getName()); } Η πρώτη μέθοδος είναι ένας constructor που δέχεται ως όρισμα ένα string. Ο constructor καλεί έναν από τους constructors της κλάσης Thread. H run μπορεί να θεωρείται ως η καρδιά ενός thread - εδώ ορίζονται οι εντολές τις οποίες πρόκειται να εκτελέσει το thread.
6
6 Υλοποίηση των Threads (α΄ Τρόπος) H κλάση twoThreads διαθέτει την μέθοδο main στην οποία δημιουργούνται δυο threads – ένα που που ονομάζεται Jamaica και ένα που ονομάζεται Fiji. class TwoThreadsTest { public static void main (String[] args) { new SimpleThread("Jamaica").start(); new SimpleThread("Fiji").start(); } Output 0 Jamaica 0 Fiji 1 Fiji 1 Jamaica 2 Jamaica 2 Fiji 3 Fiji 3 Jamaica 4 Jamaica 4 Fiji 5 Jamaica 5 Fiji 6 Fiji 6 Jamaica 7 Jamaica 7 Fiji 8 Fiji 9 Fiji 8 Jamaica DONE! Fiji 9 Jamaica DONE! Jamaica
7
7 Υλοποίηση Threads σε υποκλάσεις (υπερκλάση≠Thread) public class AppletWithThread extends Applet extends Thread {……..} ΛΑΘΟΣ (Η Java δεν υποστηρίζει πολλαπλή κληρονομικότητα) Στην περίπτωση αυτή, η αξιοποίηση της λειτουργικότητας των Threads είναι εφικτή με τη χρήση ενός interface. Runnable interface: Επιβάλλει τον ορισμό μιας μεθόδου public void run( ) στις κλάσεις που το υλοποιούν
8
8 Υλοποίηση των Threads σε υποκλάσεις (2ος τρόπος) Δημιουργία κλάσης που υλοποιεί το Runnable interface. Δημιουργία ενός Thread με όρισμα στον κατασκευαστή αντικείμενο κλάσης η οποία υλοποιεί το Runnable interface. Public class MyClass implements Runnable{ ……….. Thread MyThread; ……….. public void myMethod(){ MyThread = new Thread(this, “ThreadName”); ……………. }........................... }
9
9 Υλοποίηση των Threads (β΄ Τρόπος) H start() μέθοδος του applet εξετάζει εάν clockThread = null. Εάν είναι σημαίνει οτι το Clock Applet έχει μολις αρχίσει να εκτελείται ή έχει σταματήσει η εκτέλεσή του. Και στις δυο περιπτώσεις χρειάζεται η δημιουργία ενός νέου thread. Το this είναι η αναφορά σε στιγμιότυπο της κλάσης Clock. Παράδειγμα Applet public class Clock extends java.applet.Applet implements Runnable { Thread clockThread = null; public void start() { if (clockThread == null) { clockThread = new Thread(this, "Clock"); clockThread.start(); }.......................
10
10 Υλοποίηση των Threads (β΄ Τρόπος) Παράδειγμα Applet (συνέχεια) public void run() { // loop terminates when clockThread // is set to null in stop() while (Thread.currentThread() == clockThread) { repaint(); try { clockThread.sleep(1000); } catch (InterruptedException e){} } Είναι η καρδιά της thread – καλεί την repaint() η οποία καλεί την paint – που εμφανίζει την ώρα. public void paint(Graphics g) { Date now = new Date(); g.drawString(now.getHours() + ":“ + now.getMinutes() + ":" + now.getSeconds(), 5, 10); } public void stop() { clockThread = null; }
11
11 Σύνοψη Για τη δημιουργία threads χρησιμοποιήθηκαν δύο διαφορετικοί κατασκευαστές: Για υποκλάσεις της Thread: Thread(String name) String name: το όνομα του Thread Για κλάσεις με υπερκλάση≠Thread Thread(Runnable obj,String name) Runnable Obj: αντικείμενο που υλοποιεί το Runnable interface String name: το όνομα που ανατίθεται στο Thread
12
12 Συγχρονισμός Threads Ο συγχρονισμός των Threads είναι εκτός ύλης του μαθήματος. Όσοι ενδιαφέρονται να ασχοληθούν μπορούν να ανατρέξουν στις σημειώσεις της ενότητας.
Παρόμοιες παρουσιάσεις
© 2024 SlidePlayer.gr Inc.
All rights reserved.