Συνιστάται, 2024

Επιλογή Συντάκτη

Διαφορά μεταξύ της κλάσης νήματος και της διεπαφής που μπορεί να εκτελεστεί σε Java

Ένα νήμα μπορεί να οριστεί με δύο τρόπους. Πρώτον, επεκτείνοντας μια κλάση Thread που έχει ήδη εφαρμόσει μια διεπαφή Runnable. Δεύτερον, με την άμεση εφαρμογή μιας διεπαφής Runnable . Όταν ορίζετε ένα νήμα με την επέκταση της κλάσης Thread, πρέπει να αντικαταστήσετε τη μέθοδο run () στην κλάση Thread. Όταν ορίζετε ένα νήμα που υλοποιεί μια διασύνδεση Runnable, πρέπει να εφαρμόσετε τη μοναδική μέθοδο εκτέλεσης () της διεπαφής Runnable. Η βασική διαφορά μεταξύ του Thread και του Runnable είναι ότι κάθε νήμα που ορίζεται από την επέκταση της κλάσης Thread δημιουργεί ένα μοναδικό αντικείμενο και συνδέεται με αυτό το αντικείμενο. Από την άλλη πλευρά, κάθε νήμα που ορίζεται από την εφαρμογή διεπαφής με δυνατότητα εκτέλεσης μοιράζεται το ίδιο αντικείμενο.

Ας παρατηρήσουμε κάποιες άλλες διαφορές μεταξύ του Thread και του Runnable με τη βοήθεια του πίνακα σύγκρισης που φαίνεται παρακάτω:

Συγκριτικό διάγραμμα

Βάση σύγκρισηςΝήμαΔυνατότητα εκτέλεσης
ΒασικόςΚάθε νήμα δημιουργεί ένα μοναδικό αντικείμενο και συνδέεται με αυτό.Πολλά θέματα έχουν τα ίδια αντικείμενα.
ΜνήμηΚαθώς κάθε νήμα δημιουργεί ένα μοναδικό αντικείμενο, απαιτείται περισσότερη μνήμη.Καθώς πολλά θέματα μοιράζονται το ίδιο αντικείμενο, χρησιμοποιείται λιγότερη μνήμη.
ΕπέκτασηΣτην Java, δεν επιτρέπεται πολλαπλή κληρονομικότητα, αφού μια τάξη επεκτείνει την κλάση Thread, δεν μπορεί να επεκτείνει οποιαδήποτε άλλη τάξη.Αν μια κλάση καθορίζει το νήμα που υλοποιεί τη διεπαφή Runnable, έχει την ευκαιρία να επεκτείνει μια κλάση.
ΧρήσηΈνας χρήστης πρέπει να επεκτείνει την κλάση thread μόνο αν θέλει να παρακάμψει τις άλλες μεθόδους στην κλάση Thread.Εάν θέλετε να εξειδικεύσετε μόνο τη μέθοδο εκτέλεσης, τότε η εκτέλεση του Runnable είναι μια καλύτερη επιλογή.
ΣύζευξηΗ επέκταση της κλάσης Thread εισάγει σφιχτή σύζευξη καθώς η κλάση περιέχει κώδικα της κλάσης Thread και επίσης η εργασία που αντιστοιχεί στο νήμαΗ υλοποίηση διεπαφής Runnable εισάγει χαλαρή σύζευξη καθώς ο κώδικας του Thread είναι ξεχωριστός από τη δουλειά των Threads.

Ορισμός της κλάσης νήματος

Το νήμα είναι μια κλάση στο πακέτο java.lang . Η κλάση Thread επεκτείνει μια κλάση Object και υλοποιεί διεπαφές Runnable . Η κλάση Thread έχει κατασκευαστές και μεθόδους για τη δημιουργία και τη λειτουργία του νήματος. Όταν δημιουργούμε πολλαπλά θέματα, κάθε νήμα δημιουργεί ένα μοναδικό αντικείμενο και συνδέεται με αυτό το αντικείμενο. Εάν δημιουργήσετε ένα νήμα που επεκτείνει την κλάση Thread, περαιτέρω δεν μπορείτε να επεκτείνετε οποιαδήποτε άλλη κλάση, καθώς η java δεν υποστηρίζει πολλαπλή κληρονομιά. Επομένως, θα πρέπει να επιλέξετε να επεκτείνετε την κλάση Thread μόνο όταν θέλετε επίσης να αντικαταστήσετε μερικές άλλες μεθόδους της κλάσης Thread. Ας δούμε ένα παράδειγμα δημιουργίας ενός νήματος που επεκτείνει μια κλάση Thread.

 / * Ορισμός ενός νήματος * / Η κλάση Mythread επεκτείνει το νήμα {/ * δουλειά του νήματος * / public void run () {για (int i = 0; i <10; i ++) {System.Out.Println ) · }} Κλάση mainThread {/ * δουλειά του κύριου νήματος * / public static κενό main (String args []) {Mythread mt = new Mythread (); / * κεντρικό νήμα δημιούργησε το νήμα του παιδιού * / mt.start (); για το (int i = 0; i <10; i ++) {System.Out.Print ("Κύριο Θέμα"); }}} / * Έξοδος * / Κύριο σπείρωμα Κύριο σπείρωμα Κύριο σπείρωμα Κύριο σπείρωμα Υποσύνολο παιδιού Υποσύνολο παιδιού Υποσύνολο παιδιού Υποσύνολο παιδιού Κύριο σπείρωμα Παιδικό σπείρωμα Κύριο σπείρωμα Κύριο σπείρωμα Παιδικό σπείρωμα Παιδικό σπείρωμα Κύριο σπείρωμα Κύριο σπείρωμα Παιδικό σπείρωμα Παιδικό νήμα Κύριο σπείρωμα 

Στον παραπάνω κώδικα, δημιουργώ μια κλάση Mythread που επεκτείνει την κλάση Thread και παρακάμπτει μια μέθοδο εκτέλεσης της κλάσης Thread. Στην κλάση που περιέχει την κύρια μέθοδο δημιουργώ ένα αντικείμενο νήμα (mt) της κλάσης Mythread και χρησιμοποιώντας το αντικείμενο κλωστής που επικαλείται τη μέθοδο start (). Η μέθοδος εκκίνησης ξεκινά την εκτέλεση του νήματος και ταυτόχρονα ο JVM επικαλείται τη μέθοδο εκτέλεσης του νήματος. Τώρα υπάρχουν δύο κλωστές στο πρόγραμμα ένα κύριο νήμα και ένα δεύτερο νήμα παιδί που δημιουργήθηκε από το κύριο νήμα. Η εκτέλεση και των δύο νημάτων συμβαίνει ταυτόχρονα, αλλά η ακριβής έξοδος δεν μπορεί να προσποιηθεί.

Ορισμός διεπαφής που μπορεί να εκτελεστεί

Το Runnable είναι μια διεπαφή στο πακέτο java.lang . Εφαρμογή διεπαφής Runnable μπορούμε να ορίσουμε ένα νήμα. Το διεπαφές Runnable έχει μια ενιαία μέθοδο εκτέλεσης (), η οποία υλοποιείται από την κλάση που υλοποιεί διεπαφή Runnable. Όταν επιλέγετε να ορίσετε το νήμα με την εφαρμογή διεπαφής Runnable, έχετε ακόμα την επιλογή να επεκτείνετε οποιαδήποτε άλλη κλάση. Όταν δημιουργείτε πολλαπλά θέματα, εφαρμόζοντας διεπαφή Runnable, κάθε νήμα μοιράζεται την ίδια περίπτωση εκτέλεσης. ας μάθουμε πώς να ορίσουμε ένα νήμα χρησιμοποιώντας τη διεπαφή Runnable.

 / * Καθορισμός ενός νήματος * / Η κλάση Runnablethread υλοποιεί το Runnable {/ * δουλειά του νήματος * / public void run () {για (int i = 0; i <10; i ++) {System.Out.Println ) · }} Κλάση mainThread {/ * δουλειά του κεντρικού νήματος * / public static void main (String args []) {Mythread rt = νέο Mythread (); / * κεντρικό νήμα δημιούργησε το αντικείμενο που μπορεί να εκτελεστεί * / Θέμα t = νέο Θέμα (rt); / * το κύριο νήμα δημιουργεί το νήμα του παιδιού και μεταβιβάζει το τρέχον αντικείμενο * / t.start (); για το (int i = 0; i <10; i ++) {System.Out.Print ("Κύριο Θέμα"); }}} / * Έξοδος * / Κύριο σπείρωμα Κύριο σπείρωμα Κύριο σπείρωμα Κύριο σπείρωμα Υποσύνολο παιδιού Υποσύνολο παιδιού Υποσύνολο παιδιού Υποσύνολο παιδιού Κύριο σπείρωμα Παιδικό σπείρωμα Κύριο σπείρωμα Κύριο σπείρωμα Παιδικό σπείρωμα Παιδικό σπείρωμα Κύριο σπείρωμα Κύριο σπείρωμα Παιδικό σπείρωμα Παιδικό νήμα Κύριο σπείρωμα 

Στον παραπάνω κώδικα, δημιούργησα μια κλάση Runnablethread που υλοποιεί διεπαφή Runnable και καθορίζει τη δουλειά του νήματος εφαρμόζοντας τη μέθοδο run () της διεπαφής Runnable. Στη συνέχεια, δημιουργώ μια mainthread κατηγορίας που περιέχει την κύρια μέθοδο. Μέσα στην κύρια μέθοδο, δηλώσαμε ένα runnable αντικείμενο της κλάσης Runnablethread και πέρασα αυτό το αντικείμενο στον κατασκευαστή του Thread ενώ δηλώσαμε ένα νήμα. Με αυτό τον τρόπο, συνέδεσα το αντικείμενο κλωστή (t) με ένα αντικείμενο που μπορεί να τρέξει (rt). Στη συνέχεια, το αντικείμενο του νήματος επικαλείται τη μέθοδο έναρξης του νήματος, το οποίο επικαλείται περαιτέρω μέθοδο εκτέλεσης της κλάσης Runnablethread. Εάν δεν είχα συνδέσει το αντικείμενο που μπορεί να εκτελεστεί με αντικείμενο Thread, τότε η μέθοδος έναρξης των νημάτων θα είχε επικαλεσθεί τη μέθοδο εκτέλεσης της κλάσης Thread. Τώρα, και πάλι υπάρχουν δύο κλωστές στον κώδικα, το κύριο νήμα και το κύριο νήμα δημιουργεί το νήμα του παιδιού τόσο που εκτελείται ταυτόχρονα, αλλά η ακριβής έξοδος δεν μπορεί ποτέ να προσποιηθεί.

Βασικές διαφορές μεταξύ του νήματος και της εκτέλεσης σε Java

  1. Κάθε κλωστή που δημιουργείται με την επέκταση της κλάσης Thread δημιουργεί ένα μοναδικό αντικείμενο γι 'αυτό και συνδέεται με αυτό το αντικείμενο. Από την άλλη πλευρά, κάθε νήμα που δημιουργείται με την υλοποίηση διεπαφής Runnable μοιράζεται την ίδια περίπτωση εκτέλεσης.
  2. Καθώς κάθε νήμα συσχετίζεται με ένα μοναδικό αντικείμενο όταν δημιουργείται με την επέκταση της κλάσης Thread, απαιτείται περισσότερη μνήμη. Από την άλλη πλευρά, κάθε κλωστή που δημιουργήθηκε με την υλοποίηση του διαμοιρασμού διεπαφής του Runnable μοιράζεται τον ίδιο χώρο αντικειμένου, συνεπώς, απαιτεί λιγότερη μνήμη.
  3. Εάν επεκτείνετε την κλάση Thread τότε μπορείτε να κληρονομήσετε οποιαδήποτε άλλη κλάση, καθώς η Java δεν επιτρέπει πολλαπλή κληρονομιά, ενώ η εφαρμογή Runnable παρέχει ακόμα μια πιθανότητα για μια τάξη να κληρονομήσει οποιαδήποτε άλλη τάξη.
  4. Κάποιος πρέπει να επεκτείνει μια κλάση Thread μόνο αν πρέπει να παρακάμψει ή να εξειδικεύσει ορισμένες άλλες μεθόδους της κλάσης Thread. Πρέπει να εφαρμόσετε μια διεπαφή Runnable εάν θέλετε να εξειδικεύσετε μόνο τη μέθοδο εκτέλεσης.
  5. Η επέκταση της κλάσης Thread εισάγει σφιχτή σύζευξη στον κώδικα, καθώς ο κώδικας του νήματος και η εργασία του νήματος περιέχονται από την ίδια κλάση. Από την άλλη πλευρά, η εφαρμογή διεπαφής Runnable εισάγει χαλαρή σύζευξη στον κώδικα καθώς ο κώδικας του νήματος αποσπάται από την εργασία που αντιστοιχεί στο νήμα.

Συμπέρασμα:

Προτιμάται να υλοποιηθεί μια διεπαφή Runnable αντί να επεκταθεί η κλάση Thread. Δεδομένου ότι η εφαρμογή Runnable κάνει τον κώδικα σας χαλαρά συνδεδεμένο καθώς ο κώδικας του νήματος είναι διαφορετικός από την κλάση που εκχωρεί εργασία στο νήμα. Απαιτεί λιγότερη μνήμη και επιτρέπει σε μια τάξη να κληρονομήσει οποιαδήποτε άλλη τάξη.

Top