Threads H two Threads main threads Jamaica Fiji

  • Slides: 21
Download presentation

Υλοποίηση των Threads (α΄ Τρόπος) H κλάση two. Threads διαθέτει την μέθοδο main στην

Υλοποίηση των Threads (α΄ Τρόπος) H κλάση two. Threads διαθέτει την μέθοδο main στην οποία δημιουργούνται δυο threads – ένα που ονομάζεται Jamaica και ένα που ονομάζεται Fiji. class Two. Threads. Test { public static void main (String[] args) { new Simple. Thread("Jamaica"). start(); new Simple. Thread("Fiji"). start(); } } Output 0 Jamaica 0 Fiji 1 Jamaica 2 Fiji 3 Jamaica 4 Fiji 5 Jamaica 5 Fiji 6 Jamaica 7 Fiji 8 Fiji 9 Fiji 8 Jamaica DONE! Fiji 9 Jamaica DONE! Jamaica

Υλοποίηση των Threads (β΄ Τρόπος) Παράδειγμα Applet (συνέχεια) public void run() { // loop

Υλοποίηση των Threads (β΄ Τρόπος) Παράδειγμα Applet (συνέχεια) public void run() { // loop terminates when clock. Thread // is set to null in stop() while (Thread. current. Thread() == clock. Thread) { repaint(); try { clock. Thread. sleep(1000); } catch (Interrupted. Exception e){} } } Είναι η καρδιά της thread – καλεί την repaint() η οποία καλεί την paint – που εμφανίζει την ώρα. public void paint(Graphics g) { Date now = new Date(); g. draw. String(now. get. Hours() + ": “ + now. get. Minutes() + ": " + now. get. Seconds(), 5, 10); } public void stop() { clock. Thread = null; } }

Παράδειγμα συγχρονισμού Ο Producer Α) παράγει έναν ακέραιο αριθμό μεταξύ 0 και 9 (συμπεριλαμβάνων

Παράδειγμα συγχρονισμού Ο Producer Α) παράγει έναν ακέραιο αριθμό μεταξύ 0 και 9 (συμπεριλαμβάνων ). Β)τον αποθηκεύει σε ένα κοινόχρηστο αντικείμενο Cubby. Hole Γ)τυπώνει αριθμό. τον public class Producer extends Thread { private Cubby. Hole cubbyhole; private int number; public Producer(Cubby. Hole c, int number) { cubbyhole = c; this. number = number; } public void run() { for (int i = 0; i < 10; i++) { cubbyhole. put(i); System. out. println("Producer #" + this. number + " put: " + i); try { sleep((int)(Math. random() * 1000)); } catch (Interrupted. Exception e) { } } }

Παράδειγμα συγχρονισμού Ο Consumer, καταναλώνει όλους τους ακέραιους αριθμούς από το Cubby. Hole Πρόκειται

Παράδειγμα συγχρονισμού Ο Consumer, καταναλώνει όλους τους ακέραιους αριθμούς από το Cubby. Hole Πρόκειται για το ίδιο ακριβώς αντικείμενο στο οποίο ο Producer έβαλε τους ακέραιους αριθμούς αρχικά. public class Consumer extends Thread { private Cubby. Hole cubbyhole; private int number; public Consumer(Cubby. Hole c, int number) { cubbyhole = c; this. number = number; } public void run() { int value = 0; for (int i = 0; i < 10; i++) { value = cubbyhole. get(); System. out. println("Consumer #" + this. number + " got: " + value) } } }

Παράδειγμα συγχρονισμού Ο συγχρονισμός μεταξύ αυτών των δύο threads υλοποιείται σε χαμηλότερο επίπεδο, μέσα

Παράδειγμα συγχρονισμού Ο συγχρονισμός μεταξύ αυτών των δύο threads υλοποιείται σε χαμηλότερο επίπεδο, μέσα στις μεθόδους get() και put() του αντικειμένου Cubby. Hole. public class Cubby. Hole { private int contents; private boolean available = false; public synchronized int get() { while (available == false) { try { wait(); } catch (Interrupted. Exception e) { } available = false; System. out. println("in get"); notify. All(); return contents; } …………………

Παράδειγμα συγχρονισμού …………………. Ο συγχρονισμός μεταξύ αυτών των δύο threads υλοποιείται σε χαμηλότερο επίπεδο,

Παράδειγμα συγχρονισμού …………………. Ο συγχρονισμός μεταξύ αυτών των δύο threads υλοποιείται σε χαμηλότερο επίπεδο, μέσα στις μεθόδους get() και put() του αντικειμένου Cubby. Hole. public synchronized void put(int value) { while (available == true) { try { wait(); } catch (Interrupted. Exception e) { } contents = value; available = true; System. out. println("in gut"); notify. All(); } Output. . . Consumer #1 got: 3 Producer #1 put: 4 Producer #1 put: 5 Consumer #1 got: 5. . .

Παράδειγμα συγχρονισμού Output public class Producer. Consumer. Test { public static void main(String[ ]

Παράδειγμα συγχρονισμού Output public class Producer. Consumer. Test { public static void main(String[ ] args) { Cubby. Hole c = new Cubby. Hole(); Producer p 1 = new Producer(c, 1); Consumer c 1 = new Consumer(c, 1); p 1. start(); c 1. start(); } } . . . Consumer #1 got: 3 Producer #1 put: 4 Producer #1 put: 5 Consumer #1 got: 5. . .