Σημαντικό ρόλο στον προγραμματισμό Java εφαρμογών έχουν τα Νήματα ή Threads. Ουσιαστικά ένα νήμα δεν δεν είναι τίποτα άλλο από μια σειρά εντολών που θα εκτελεστεί "παράλληλα" με το πρόγραμμα ή θα ενεργοποιηθεί την κατάλληλη χρονική στιγμή και όταν εμείς επιλέξουμε, και θα τερματίσει ή όταν ολοκληρώσει τις διεργασίες ή όταν (κατά συνθήκη) επιλέξουμε εμείς ή ακόμα και να εισέρχεται σε ατέρμονη επανάληψη.
Ένα νήμα ορίζεται μέσα σε μια κλάση από τις εξής βασικές εντολές:
1. Η κλάση που θα υπάρχει το νήμα ή τα νήματα, θα πρέπει να είναι implements Runnable
2. Ορίζουμε το νήμα στις Ιδιότητες της κλάσης π.χ. Thread runner;
3. Στο κατασκευαστή της κλάσης συμπεριλαμβάνουμε και την κατασκευή του νήματος ορίζοντας το με τον παρακάτω κώδικα.
if (runner == null) {//αν δεν υπάρχει το νήμαrunner = new Thread(this);//δημιουργία νήματος
}
4. Εισάγουμε την μέθοδο void run() που θα περιέχει τον εκτελέσιμο κώδικα, δηλαδή το τι θέλουμε να κάνει το νήμα. public void run() {...}
5. Ελέγχουμε το νήμα με τις void εντολές runner.start(); ή runner.run(); για έναρξη και runner.destroy(); ή runner.stop(); για λήξη. Για παράδειγμα, αν θέλουμε το νήμα να ξεκινά με την κατασκευή αντικειμένου της κλάσης τότε η εντολή runner.start(); θα πρέπει να συμπεριληφθεί μέσα στην παραπάνω εντολή if.
Κατά την εκτέλεση της εφαρμογής μας όταν η σειρά εκτέλεσης φτάσει στην εντολή runner.start(); τότε θα ξεκινήσει αυτόματα η εκτέλεση του κώδικα της μεθόδου run, και αντίστοιχα runner.destroy(); στην καταστροφή του νήματος ή στην λήξη του.
Βέβαια, η ύπαρξη νήματος ή νημάτων στον κώδικά μας και η διαχείριση τους, απαιτεί κατανόηση του χρόνο-προγραμματισμού εργασιών της εφαρμογής. Για να μπορέσουμε να "δαμάσουμε" ένα ή περισσότερα νήματα ορίζουμε χρόνο-καθυστέρηση με την εντολή Thread.sleep .
Αυτό μας δίνει την δυνατότητα να ορίσουμε ένα συγκεκριμένο χρόνο ή κάποιο τυχαίο χρονικό διάστημα. Η εντολή Thread.sleep(όρισμα) δέχεται σαν όρισμα χρόνο σε msec. Με άλλα λόγια αν θέλουμε να "καθυστερήσουμε" σε κάποιο σημείο του κώδικα την εκτέλεση του νήματος για 1sec τότε γράφουμε Thread.sleep(1*1000); ή Thread.sleep(1000);
Στην περίπτωση που θέλουμε ένα τυχαίο διάστημα τότε θα πρέπει να χρησιμοποιήσουμε την γεννήτρια παραγωγής τυχαίων αριθμών με τις παρακάτω εντολές:
Random rand = new Random();
int delay = rand.nextInt(3) + 1;
Thread.sleep(delay*1000);
Εξηγώντας την εντολή int delay = rand.nextInt(3) + 1; ορίζουμε ότι η μεταβλητή delay θα είναι integer αριθμός και θα παράγεται τυχαία με την εντολή rand.nextInt(3) από 3 αριθμούς : ή 0 ή 1 ή 2. Για να μην έχουμε το μηδέν, γιατί ο μηδενικός χρόνος δεν μας είναι απαραίτητος, τότε προσθέτουμε στον τυχαίο αυτό αριθμό και την μονάδα(+1).
Έτσι οι τυχαίοι αριθμοί που θα προκύπτουν θα είναι ή 1 ή 2 ή 3. Για να τροποποιήσουμε τα msec σε sec, απλά πολλαπλασιάζουμε με το 1000. Συνεπώς ο παραπάνω κώδικας "καθυστερεί" το νήμα runner από 10 έως 30 sec.
Κατά αυτόν τον τρόπο μπορούμε να διαχειριστούμε πολλαπλά νήματα μέσα σε μια εφαρμογή, ορίζοντας τους κατάλληλους χρόνους καθυστέρησης για την εκτέλεσής τους.
Το ατέρμονο Loop
Σε περίπτωση που θέλουμε ο κώδικας της μεθόδου run να εκτελείτε συνέχεια και κατά συνέπεια το νήμα τότε τον εμπερικλείουμε τον κώδικα αυτών σε ένα while Loop
Για παράδειγμα, while(true){ to do code.....}//endless loop ή σε ένα infinite loop με προϋποθέσεις όπως ο παρακάτω κώδικας
boolean flag=true;while(flag==true){ to do code...}
Ο παραπάνω κώδικας μας δίνει την δυνατότητα να σταματήσουμε την εκτέλεση του κώδικα του νήματος υπο-προϋποθέσεις, δηλαδή σε περίπτωση που η μεταβλητή flag γίνει ή οριστεί false;
Γενικά η χρήση των νημάτων η χρονική πολυπλοκότητα ή πολυπλεξία τους αποτελεί την βάση για την υλοποίηση όλων σχεδόν των σύγχρονων εφαρμογών στους υπολογιστές. Η "ταυτόχρονη" χρήση και πληκτρολόγηση σε ένα κειμενογράφο, με την χρήση ενός περιηγητή για την πλοήγηση σας στο διαδίκτυο είναι προϊόν νημάτων και χρόνο-προγραμματισμού.
Δημοσίευση σχολίου