Σκοπός της άσκησης είναι να εξοικειωθείτε με τις βασικές έννοιες του πολυνηματικού προγραμματισμού (multi-threading) και τις κατασκευές της Java που υποστηρίζουν το παράδειγμα αυτό. Η άσκηση βασίζεται πάνω σε δύο εφαρμογές:
1. την Ping-Pong, και,
2. την Producer-Consumer.
Στόχος
Το εργαστήριο έχει ως στόχο την εξοικείωση με:
1. Την κλάση Thread και ορισμένα χαρακτηριστικά της
2. Το Runnable interface
3. Την πολιτική του συστήματος για τον χρονοπρογραμματισμό των νημάτων.
4. Το κύκλο ζωής ενός νήματος (thread life cycle)
Διαδικασία εκτέλεσης
Η δραστηριότητα αποτελείται από 2 ασκήσεις. Εκτελέστε τις με την σειρά που δίνονται
Άσκηση 1. Ping - Pong
Iteration No 1.
Βήμα 1
Αναπτύξτε ένα πρόγραμμα που θα δημιουργεί και θα εκκινεί 2 νήματα. Το κάθε νήμα θα τυπώνει στην οθόνη για δεδομένο αριθμό επαναλήψεων ένα μήνυμα με το όνομα του και τον αριθμό της επανάληψης. Η συμπεριφορά αυτή θα ορίζεται από την κλάση PingPong.
Το ένα από τα 2 νήματα να έχει όνομα Ping και το άλλο Pong.
Τρέξτε το πρόγραμμα και προσπαθήστε να κατανοήσετε, αξιοποιώντας τον κύκλο ζωής νήματος (thread life cycle) της Java, πως το σύστημα εκτελεί τα νήματα της εφαρμογής σας.
Τροποποιήστε το πρόγραμμα σας ώστε η main να τυπώνει μια φορά για το κάθε ένα νήμα το πόσες φορές αυτό έχει τυπώσει στην οθόνη το όνομα του.
Είναι η έξοδος του προγράμματος σας προβλέψιμη και σαφώς ορισμένη; Αιτιολογήστε.
Βήμα 2
Δοκιμάστε να βάλετε το κάθε νήμα να «κοιμάται» για κάποιο χρόνο πριν την επόμενη επανάληψη.
Παρατηρήστε τη συμπεριφορά του προγράμματος σας και συσχετίσατε την με τον κύκλο ζωής νήματος (thread life cycle) της Java.
Σχολιάστε.
Βήμα 3
Αξιοποίηση των Προτεραιοτήτων των νημάτων (thread priority)
Στην εφαρμογή που ήδη αναπτύξατε δώστε διαφορετικές προτεραιότητες στα νήματα σας για να παρατηρήσετε την συμπεριφορά της JVM. Σε κάθε περίπτωση αιτιολογήστε την συμπεριφορά αυτή.
Δοκιμάστε να ορίσετε τις προτεραιότητες των νημάτων σας για να πετύχετε να δίνει το πρόγραμμα σας το αποτέλεσμα που θέλετε. Σχολιάστε τα αποτελέσματα.
Βήμα 4
Δοκιμάστε την χρήση της μεθόδου isAlive() για να πετύχετε το αποτέλεσμα που θέλετε στην έξοδο.
Σχολιάστε τα αποτελέσματα.
Iteration No 2
Τροποποιήστε την εφαρμογή που αναπτύξατε χρησιμοποιώντας αντί για την κλάση Thread το Runnable interface.
Ποιο είναι το πλεονέκτημα από την χρήση του interface αυτού σε σύγκριση με την κλάση Thread;
Άσκηση 2. Παραγωγός – Καταναλωτής
Αναπτύξτε μια εφαρμογή η οποία θα προσομοιώνει τη λειτουργία του αφαιρετικού προβλήματος Παραγωγού-Καταναλωτή (Producer/Consumer).
Ο παραγωγός θα παράγει ένα αγαθό και θα το βάζει σε μια αποθήκη, με χωρητικότητα ένα αγαθό, από την οποία θα το παίρνει ο καταναλωτής και θα το καταναλώνει.
Το αγαθό αποτελείται από δυο μέρη. Το ένα είναι ακέραιο και παίρνει τιμές από 1 μέχρι 100 και το άλλο αλφαριθμιτικό με τιμές “1”, “2”, … αντίστοιχα.
Ορίστε την έξοδο του προγράμματος σας στην οθόνη ώστε να μπορείτε να παρακολουθείτε την λειτουργία του προγράμματος σας.
Μελετήστε τη συμπεριφορά της εφαρμογής σας. Παρατηρήστε πιθανά προβλήματα. Καταγράψτε τα.
Προτείνατε λύσεις.
Δεν χρησιμοποιείτε στην φάση αυτή μηχανισμούς της γλώσσας που υποστηρίζουν συγχρονισμό νημάτων καθώς δεν τους μελετήσαμε και δεν αποτελούν μέρος της ύλης του εξαμήνου αυτού.