Τι είναι το BlockingQueue στην Java και πώς να το εφαρμόσετε;



Αυτό το άρθρο σχετικά με το BlockingQueue στην Java θα σας βοηθήσει να μάθετε για τη διασύνδεση BlockingQueue. Θα σας δώσει επίσης πληροφορίες για τις μεθόδους και την πρακτική εφαρμογή του

είναι εξαιρετικά δημοφιλές στους προγραμματιστές λόγω του πλήρους εύρους των ενσωματωμένων χαρακτηριστικών του. Τις περισσότερες φορές θα έχετε μια ειδική λύση για το πρόβλημά σας, ακόμη και πριν εμφανιστεί. Ένα τόσο πολύ χρήσιμο και σημαντικό μέρος του είναι η διεπαφή BlockingQueue στην Java. Μέσω του μέσου αυτού του άρθρου, θα ρίξω λίγο φως στο BlockingQueue στην Java και τις μεθόδους για την εφαρμογή του.

Ακολουθούν τα θέματα που καλύπτονται σε αυτό το άρθρο:





είναι καλό άτομο για python

Διασύνδεση BlockingQueue σε Java

BlockingQueue στην Java είναι μια διεπαφή που προστέθηκε στην Java 1.5 μαζί με μερικές άλλες ταυτόχρονες κλάσεις Utility όπως ConcurrentHashMap, CopyOnWriteArrrayList, κλπ. Η διασύνδεση BlockingQueue ανήκει στο java.util.concurrent πακέτο .Αυτή η διεπαφή βελτιώνει τον έλεγχο ροής ενεργοποιώντας το μπλοκάρισμα, σε περίπτωση που ένα νήμα προσπαθεί να αδειάσει μια κενή ουρά ή να γεμίσει μια πλήρη ουρά. Σε κάθε περίπτωση, αυτή η διεπαφή έρχεται σε πρακτική.Με πιο απλούς όρους, ας υποθέσουμε προσπαθεί να προσθέσει στοιχεία σε μια ήδη πλήρη ουρά. Σε αυτό το σημείο του προγράμματος, θα κληθεί το BlockingQueue το οποίο θα μπλοκάρει το συγκεκριμένο νήμα έως ότου ένα άλλο νήμα απελευθερώσει την ουρά για να δημιουργήσει χώρο. Αυτό μπορεί να οφείλεται είτε στην αποβολή ενός στοιχείου (α) εκκαθάρισης ολόκληρης της ουράς. Παρομοίως, το BlockingQueue θα κληθεί να μπλοκάρει ένα νήμα που προσπαθεί να απομακρύνει μια ήδη κενή ουρά έως ότου κάποιο άλλο νήμα εισάγει ή προσθέσει ένα στοιχείο στο Ουρά .

Ενώ εργάζεστε με τη διασύνδεση BlockingQueue στην Java, πρέπει να θυμάστε ότι δεν δέχεται μηδενική τιμή. Σε περίπτωση που προσπαθήσετε να το κάνετε αυτό, θα ρίξει αμέσως ένα NullPointerException. Το παρακάτω σχήμα αντιπροσωπεύει τη λειτουργία της διασύνδεσης BlockingQueue στην Java.



BlockingQueue - BlockingQueue σε Java - EdurekaΑυτό διεπαφή χρησιμοποιείται κυρίως μεταξύ παραγωγών-καταναλωτών, καθώς είναι ασφαλές για νήμα.Αυτό που εννοώ είναι ότι η διασύνδεση BlockingQueue μπορεί να χρησιμοποιηθεί για τη δημιουργία μιας ουράς που μπορεί να μοιραστεί τόσο ο παραγωγός όσο και ο καταναλωτής

Για να δουλέψετε με το BlockingQueue στην Java, πρώτα, πρέπει να εξοικειωθείτε με τους τύπους του. Επιτρέψτε μου να σας παρουσιάσω στην επόμενη ενότητα αυτού του άρθρου.

Τύποι κατασκευαστών για BlockingQueue στην Java

Υπάρχουν δύο τύποι κατασκευαστών για διασύνδεση BlockingQueue στην Java:



  • Χωρίς περιορισμούς ουρά: Για αυτόν τον τύπο ουράς, η χωρητικότητα θα οριστεί σε Integer.MAX_VALUE. Μια μη περιορισμένη ουρά δεν θα μπλοκαριστεί ποτέ καθώς μπορεί να αναπτυχθεί δυναμικά, κάθε φορά που ένα στοιχείο εισάγεται σε αυτό. Ακολουθεί η σύνταξη για τη δημιουργία μιας μη περιορισμένης ουράς:
BlockingQueue bq = νέο LinkedBlockingDeque ()
  • Οριοθετημένη ουρά: Για αυτού του είδους την ουρά, πρέπει να περάσετε την χωρητικότητα της ουράς κατά τη στιγμή της δημιουργίας της, δηλαδή ως οικοδόμος παράμετρος. Μόλις εκχωρηθεί το μέγεθος, δεν μπορεί να αλλάξει. Ακολουθεί η σύνταξη για τη δημιουργία μιας οριοθετημένης ουράς:
BlockingQueue bq = νέο LinkedBlockingDeque (10)

Τώρα που είστε εξοικειωμένοι με τους τρόπους εφαρμογής του BlockingQueue στην Java, επιτρέψτε μου να αναφέρω μερικές από τις μεθόδους του.

Μέθοδοι στη διασύνδεση BlockingQueue

Μέθοδος Περιγραφή
boolean add (E ε) Αυτή η μέθοδος βοηθά στην εισαγωγή του καθορισμένου στοιχείου σε αυτήν την ουρά εάν υπάρχει κενό στην ουρά αλλιώς θαρίξτε έναIlegalStateException
Το boolean περιέχει (αντικείμενο o) Αυτή η μέθοδος επιστρέφει true αν η ουρά περιέχει το καθορισμένο στοιχείο
int drainTo (Συλλογή γ) Αυτή η μέθοδος θα αφαιρέσει όλα τα διαθέσιμα στοιχεία από την ουρά και θα τα προσθέσει στην καθορισμένη συλλογή
int drainTo (Συλλογή c, int maxElements) Αυτή η μέθοδος θα αφαιρέσει με δεδομένο αριθμό διαθέσιμων στοιχείων από την ουρά και θα τα προσθέσει στο καθορισμένο
booloean προσφορά (E ε) Αυτή η μέθοδος θα εισαγάγει το καθορισμένο στοιχείο στην ουρά εάν δεν είναι πλήρες και επιστρέψει αληθινό, αλλιώς θα επιστρέψει ψευδές
boolean προσφορά (E, longout, μονάδα TimeUnit) Αυτή η μέθοδος θα εισαγάγει το καθορισμένο στοιχείο στην ουρά. Σε περίπτωση που η ουρά είναι γεμάτη, θα περιμένει μέχρι τον καθορισμένο χρόνο αναμονής για να γίνει διαθέσιμος ο χώρος.
Ηλεκτρονική ψηφοφορία (longout, TimeUnit unit) Αυτή η μέθοδος βοηθά στην ανάκτηση και αφαίρεση της κεφαλής της ουράς. Σε περίπτωση που η ουρά είναι κενή, θα περιμένει μέχρι τον καθορισμένο χρόνο αναμονής για να γίνει διαθέσιμο ένα στοιχείο
void put (E ε) Αυτή η μέθοδος θα εισαγάγει το καθορισμένο στοιχείο στην ουρά περιμένοντας να διατεθεί χώρος σε περίπτωση που η ουρά είναι πλήρης
int υπόλοιπο Χωρητικότητα () Αυτή η μέθοδος βοηθά στην επιστροφή του αριθμού των πρόσθετων στοιχείων που αυτή η ουρά μπορεί ιδανικά να αποδεχθεί χωρίς να μπλοκαριστεί
boolean remove (Αντικείμενο o) Αυτή η μέθοδος θα αφαιρέσει μία μόνο παρουσία του καθορισμένου στοιχείου από την ουρά μόνο εάν υπάρχει
Ε παίρνω () Αυτή η μέθοδος θα βοηθήσει στην ανάκτηση και την αφαίρεση της κεφαλής της ουράς περιμένοντας να είναι διαθέσιμο ένα στοιχείο, σε περίπτωση που η ουρά είναι κενή.

Εφαρμογές BlockingQueue

Εδώ θα εφαρμόσω ένα απλό παράδειγμα του BlockingQueue στην Java όπουΗ κλάση EduProducer θα δημιουργήσει τα δεδομένα και θα τα εισαγάγει σε ένα Ουρά , ταυτόχρονα, μια άλλη τάξη, το EduConsumer θα αφαιρέσει τα δεδομένα από την ίδια ουρά.

Γι 'αυτό θα δημιουργήσω 3 τάξεις και συγκεκριμένα:

  1. EduProducer
  2. EduConsumer
  3. Edureka Κύρια

Ας δημιουργήσουμε τώρα καθένα από αυτά τα μαθήματα ένα προς ένα.

EduProducer.java

package edureka import java.util.concurrent.BlockingQueue δημόσια τάξη Το EduProducer υλοποιεί Runnable {private final BlockingQueue queue @Override public void run () {try {process ()} catch (InterruptException e) {Thread.currentThread (). interrupt ()} } ιδιωτική διαδικασία κενού () ρίχνει το InterruptException {// Βάλτε 10 ints στην ουρά για (int i = 0 i<10 i++) { System.out.println('[Producer] Add : ' + i) queue.put(i) System.out.println('[Producer] Queue's Remaining Capacity : ' + queue.remainingCapacity()) Thread.sleep(150) } } public EduProducer(BlockingQueue queue) { this.queue = queue } }

EduConsumer.java

package edureka import java.util.concurrent.BlockingQueue public class EduConsumer υλοποιεί Runnable {private final BlockingQueue queue @Override public void run () {try {while (true) {Integer take = queue.take () process (take)}} catch (InterruptException e) {Thread.currentThread (). Interrupt ()}} ιδιωτική διαδικασία κενού (Integer take) ρίχνει το InterruptException {System.out.println ('[Consumer] Remove:' + take) Thread.sleep (500)} δημόσια EduConsumer (ουρά BlockingQueue) {this.queue = queue}}

EdurekaMain.java

πακέτο edureka import java.util.concurrent.BlockingQueue import java.util.concurrent.LinkedBlockingQueue public class EdurekaMain {public static void main (String [] args) {BlockingQueue queue = new LinkedBlockingQueue (10) new Thread (νέο EduProducer) .start () νέο νήμα (νέο EduConsumer (ουρά)). έναρξη ()}}

Μόλις ολοκληρώσετε τη σύνταξη του κώδικα, εκτελέστε το πρόγραμμα για να λάβετε την παρακάτω έξοδο:

[Παραγωγός] Προσθήκη: 0 [Καταναλωτής] Λήψη: 0 [Παραγωγός] Παραμένουσα χωρητικότητα ουράς: 9 [Παραγωγός] Προσθήκη: 1 [Παραγωγός] Παραμένουσα χωρητικότητα ουράς: 9 [Παραγωγός] Προσθήκη: 2 [Παραγωγός] Παραμονή χωρητικότητας της ουράς: 8 [Παραγωγός ] Προσθήκη: 3 [Παραγωγός] Παραμένουσα χωρητικότητα ουράς: 7 [Καταναλωτής] Λήψη: 1 [Παραγωγός] Προσθήκη: 4 [Παραγωγός] Παραμένουσα χωρητικότητα ουράς: 7 [Παραγωγός] Προσθήκη: 5 [Παραγωγός] Παραμένουσα χωρητικότητα ουράς: 6 [Παραγωγός] Προσθήκη : 6 [Παραγωγός] Παραμένουσα χωρητικότητα ουράς: 5 [Καταναλωτής] Λήψη: 2 [Παραγωγός] Προσθήκη: 7 [Παραγωγός] Παραμονή χωρητικότητας ουράς: 5 [Παραγωγός] Προσθήκη: 8 [Παραγωγός] Παραμονή χωρητικότητας της ουράς: 4 [Παραγωγός] Προσθήκη: 9 [Παραγωγός] Παραμένουσα χωρητικότητα ουράς: 3 [Καταναλωτής] Λήψη: 3 [Καταναλωτής] Λήψη: 4 [Καταναλωτής] Λήψη: 5 [Καταναλωτής] Λήψη: 6 [Καταναλωτής] Λήψη: 7 [Καταναλωτής] Λήψη: 8 [Καταναλωτής] Λήψη: 9

Αυτό μας φέρνει στο τέλος αυτού του άρθρου σχετικά με το BlockingQueue στην Java. Αν θέλετε να μάθετε Java πιο αναλυτικά, μπορείτε να ανατρέξετε στο επισης.

Τώρα που έχετε κατανοήσει τα βασικά του BlockingQueue στην Java, ρίξτε μια ματιά στο από την Edureka, μια αξιόπιστη διαδικτυακή εταιρεία εκμάθησης με δίκτυο περισσότερων από 250.000 ικανοποιημένων μαθητών σε όλο τον κόσμο. Το μάθημα εκπαίδευσης και πιστοποίησης Java J2EE και SOA της Edureka έχει σχεδιαστεί για μαθητές και επαγγελματίες που θέλουν να γίνουν προγραμματιστές Java. Το μάθημα έχει σχεδιαστεί για να σας δώσει μια πρώτη αρχή στον προγραμματισμό Java και να σας εκπαιδεύσει τόσο για βασικές όσο και για προχωρημένες ιδέες Java μαζί με διάφορα πλαίσια Java όπως το Hibernate & Spring.

πώς να χρησιμοποιήσετε την κλάση σαρωτή

Έχετε μια ερώτηση για εμάς; Παρακαλώ αναφέρετέ το στην ενότητα σχολίων αυτού του 'BlockingQueue in Java' και θα επικοινωνήσουμε μαζί σας το συντομότερο δυνατό.