Σε αυτό το σεμινάριο, θα μάθουμε για τη διεπαφή Java BlockingQueue και τις μεθόδους της.
Η BlockingQueue
διεπαφή του Collections
πλαισίου Java επεκτείνει τη Queue
διεπαφή. Επιτρέπει σε κάθε λειτουργία να περιμένει έως ότου μπορεί να εκτελεστεί με επιτυχία.
Για παράδειγμα, εάν θέλουμε να διαγράψουμε ένα στοιχείο από μια κενή ουρά, τότε η ουρά αποκλεισμού επιτρέπει στη λειτουργία διαγραφής να περιμένει έως ότου η ουρά περιέχει ορισμένα στοιχεία που πρέπει να διαγραφούν.
Τάξεις που εφαρμόζουν BlockingQueue
Δεδομένου ότι BlockingQueue
είναι μια διεπαφή, δεν μπορούμε να παρέχουμε την άμεση εφαρμογή της.
Για να χρησιμοποιήσουμε τη λειτουργικότητα του BlockingQueue
, πρέπει να χρησιμοποιήσουμε κλάσεις που την εφαρμόζουν.
- ArrayBlockingQueue
- LinkedBlockingQueue
Πώς να χρησιμοποιήσετε τις ουρές αποκλεισμού;
Πρέπει να εισαγάγουμε το java.util.concurrent.BlockingQueue
πακέτο για να το χρησιμοποιήσουμε BlockingQueue
.
// Array implementation of BlockingQueue BlockingQueue animal1 = new ArraryBlockingQueue(); // LinkedList implementation of BlockingQueue BlockingQueue animal2 = new LinkedBlockingQueue();
Εδώ, δημιουργήσαμε αντικείμενα animal1 και animal2 κατηγοριών ArrayBlockingQueue
και LinkedBlockingQueue
, αντίστοιχα. Αυτά τα αντικείμενα μπορούν να χρησιμοποιήσουν τις λειτουργίες της BlockingQueue
διεπαφής.
Μέθοδοι BlockingQueue
Με βάση το εάν μια ουρά είναι πλήρης ή κενή, οι μέθοδοι μιας ουράς αποκλεισμού μπορούν να χωριστούν σε 3 κατηγορίες:
Μέθοδοι που αποτελούν εξαίρεση
add()
- Εισάγει ένα στοιχείο στην ουρά αποκλεισμού στο τέλος της ουράς. Ρίχνει μια εξαίρεση εάν η ουρά είναι γεμάτη.element()
- Επιστρέφει την κεφαλή της ουράς αποκλεισμού. Ρίχνει μια εξαίρεση εάν η ουρά είναι κενή.remove()
- Αφαιρεί ένα στοιχείο από την ουρά αποκλεισμού. Ρίχνει μια εξαίρεση εάν η ουρά είναι κενή.
Μέθοδοι που επιστρέφουν κάποια τιμή
offer()
- Εισάγει το καθορισμένο στοιχείο στην ουρά αποκλεισμού στο τέλος της ουράς. Επιστρέφειfalse
εάν η ουρά είναι γεμάτη.peek()
- Επιστρέφει την κεφαλή της ουράς αποκλεισμού. Επιστρέφειnull
εάν η ουρά είναι κενή.poll()
- Αφαιρεί ένα στοιχείο από την ουρά αποκλεισμού. Επιστρέφειnull
εάν η ουρά είναι κενή.
Περισσότερα σε προσφορά () και δημοσκόπηση ()
Το offer()
και η poll()
μέθοδος μπορούν να χρησιμοποιηθούν με χρονικά όρια. Δηλαδή, μπορούμε να περάσουμε μονάδες χρόνου ως παράμετρο. Για παράδειγμα,
offer(value, 100, milliseconds)
Εδώ,
- Η τιμή είναι το στοιχείο που θα εισαχθεί στην ουρά
- Και έχουμε ορίσει χρονικό όριο 100 χιλιοστών του δευτερολέπτου
Αυτό σημαίνει ότι η offer()
μέθοδος θα προσπαθήσει να εισαγάγει ένα στοιχείο στην ουρά αποκλεισμού για 100
χιλιοστά του δευτερολέπτου. Εάν το στοιχείο δεν μπορεί να εισαχθεί σε 100 χιλιοστά του δευτερολέπτου, η μέθοδος επιστρέφει false
.
Σημείωση: Αντί του milliseconds
, μπορούμε επίσης να χρησιμοποιήσετε αυτές τις μονάδες χρόνου: days
, hours
, minutes
, seconds
, microseconds
και nanoseconds
σε offer()
και poll()
μεθόδους.
Μέθοδοι που αποκλείουν τη λειτουργία
Η BlockingQueue
παρέχει επίσης μεθόδους για να εμποδίσει τις επιχειρήσεις και να περιμένουμε, αν η ουρά είναι γεμάτη ή άδεια.
put()
- Εισάγει ένα στοιχείο στην ουρά αποκλεισμού. Εάν η ουρά είναι γεμάτη, θα περιμένει έως ότου η ουρά έχει χώρο για να εισαγάγει ένα στοιχείο.take()
- Αφαιρεί και επιστρέφει ένα στοιχείο από την ουρά αποκλεισμού. Εάν η ουρά είναι κενή, θα περιμένει έως ότου τα στοιχεία να διαγραφούν στην ουρά.
Ας υποθέσουμε ότι θέλουμε να εισαγάγουμε στοιχεία σε μια ουρά. Εάν η ουρά είναι πλήρης, τότε η put()
μέθοδος θα περιμένει έως ότου η ουρά έχει χώρο για την εισαγωγή στοιχείων.
Ομοίως, εάν θέλουμε να διαγράψουμε στοιχεία από μια ουρά. Εάν η ουρά είναι κενή, τότε η take()
μέθοδος θα περιμένει έως ότου η ουρά περιέχει στοιχεία προς διαγραφή.
Υλοποίηση του BlockingQueue στο ArrayBlockingQueue
import java.util.concurrent.BlockingQueue; import java.util.concurrent.ArrayBlockingQueue; class Main ( public static void main(String() args) ( // Create a blocking queue using the ArrayBlockingQueue BlockingQueue numbers = new ArrayBlockingQueue(5); try ( // Insert element to blocking queue numbers.put(2); numbers.put(1); numbers.put(3); System.out.println("BLockingQueue: " + numbers); // Remove Elements from blocking queue int removedNumber = numbers.take(); System.out.println("Removed Number: " + removedNumber); ) catch(Exception e) ( e.getStackTrace(); ) ) )
Παραγωγή
BlockingQueue: (2, 1, 3) Στοιχείο που αφαιρέθηκε: 2
Για να μάθετε περισσότερα ArrayBlockingQueue
, επισκεφθείτε το Java ArrayBlockingQueue.
Γιατί το BlockingQueue;
Στην Java, BlockingQueue
θεωρείται η ασφαλής συλλογή νήματος . Επειδή μπορεί να είναι χρήσιμο σε λειτουργίες πολλαπλών νημάτων.
Ας υποθέσουμε ότι ένα νήμα εισάγει στοιχεία στην ουρά και ένα άλλο νήμα αφαιρεί στοιχεία από την ουρά.
Τώρα, εάν το πρώτο νήμα τρέχει πιο αργά, τότε η ουρά αποκλεισμού μπορεί να κάνει το δεύτερο νήμα να περιμένει έως ότου το πρώτο νήμα ολοκληρώσει τη λειτουργία του.