Trong hướng dẫn này, chúng ta sẽ tìm hiểu về giao diện Java BlockingQueue và các phương pháp của nó.
Các BlockingQueue
giao diện của Java Collections
khuôn khổ mở rộng Queue
giao diện. Nó cho phép bất kỳ hoạt động nào chờ đợi cho đến khi nó có thể được thực hiện thành công.
Ví dụ, nếu chúng ta muốn xóa một phần tử khỏi hàng đợi trống, thì hàng đợi chặn cho phép thao tác xóa chờ cho đến khi hàng đợi chứa một số phần tử được xóa.
Các lớp triển khai BlockingQueue
Vì BlockingQueue
là một giao diện, chúng tôi không thể cung cấp việc triển khai trực tiếp nó.
Để sử dụng chức năng của BlockingQueue
, chúng ta cần sử dụng các lớp triển khai nó.
- ArrayBlockingQueue
- LinkedBlockingQueue
Làm thế nào để sử dụng hàng đợi chặn?
Chúng tôi phải nhập java.util.concurrent.BlockingQueue
gói để sử dụng BlockingQueue
.
// Array implementation of BlockingQueue BlockingQueue animal1 = new ArraryBlockingQueue(); // LinkedList implementation of BlockingQueue BlockingQueue animal2 = new LinkedBlockingQueue();
Ở đây, chúng ta đã tạo các đối tượng thú1 và thú2 của các lớp ArrayBlockingQueue
và LinkedBlockingQueue
tương ứng. Các đối tượng này có thể sử dụng các chức năng của BlockingQueue
giao diện.
Phương pháp BlockingQueue
Dựa trên việc hàng đợi đầy hay trống, các phương pháp của hàng đợi chặn có thể được chia thành 3 loại:
Các phương thức ném một ngoại lệ
add()
- Chèn một phần tử vào hàng đợi chặn ở cuối hàng đợi. Đưa ra một ngoại lệ nếu hàng đợi đã đầy.element()
- Trả về phần đầu của hàng đợi chặn. Ném một ngoại lệ nếu hàng đợi trống.remove()
- Loại bỏ một phần tử khỏi hàng đợi chặn. Ném một ngoại lệ nếu hàng đợi trống.
Các phương thức trả về một số giá trị
offer()
- Chèn phần tử được chỉ định vào hàng đợi chặn ở cuối hàng đợi. Trả vềfalse
nếu hàng đợi đã đầy.peek()
- Trả về phần đầu của hàng đợi chặn. Trả vềnull
nếu hàng đợi trống.poll()
- Loại bỏ một phần tử khỏi hàng đợi chặn. Trả vềnull
nếu hàng đợi trống.
Thêm thông tin về phiếu mua hàng () và thăm dò ý kiến ()
Các offer()
và poll()
phương pháp có thể được sử dụng với timeout. Nghĩa là, chúng ta có thể chuyển các đơn vị thời gian làm tham số. Ví dụ,
offer(value, 100, milliseconds)
Đây,
- giá trị là phần tử được chèn vào hàng đợi
- Và chúng tôi đã đặt thời gian chờ là 100 mili giây
Điều này có nghĩa là offer()
phương thức sẽ cố gắng chèn một phần tử vào hàng đợi chặn trong 100
mili giây. Nếu không thể chèn phần tử trong 100 mili giây, phương thức sẽ trả về false
.
Lưu ý: Thay vì milliseconds
, chúng ta cũng có thể sử dụng các đơn vị thời gian: days
, hours
, minutes
, seconds
, microseconds
và nanoseconds
ở offer()
và poll()
phương pháp.
Các phương thức chặn hoạt động
Nó BlockingQueue
cũng cung cấp các phương thức để chặn các hoạt động và đợi nếu hàng đợi đầy hoặc trống.
put()
- Chèn một phần tử vào hàng đợi chặn. Nếu hàng đợi đầy, nó sẽ đợi cho đến khi hàng đợi có khoảng trống để chèn một phần tử.take()
- Loại bỏ và trả về một phần tử từ hàng đợi chặn. Nếu hàng đợi trống, nó sẽ đợi cho đến khi hàng đợi có các phần tử được xóa.
Giả sử, chúng ta muốn chèn các phần tử vào một hàng đợi. Nếu hàng đợi đầy thì put()
phương thức sẽ đợi cho đến khi hàng đợi có khoảng trống để chèn các phần tử.
Tương tự, nếu chúng ta muốn xóa các phần tử khỏi hàng đợi. Nếu hàng đợi trống thì take()
phương thức sẽ đợi cho đến khi hàng đợi chứa các phần tử bị xóa.
Triển khai BlockingQueue trong 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(); ) ) )
Đầu ra
BlockingQueue: (2, 1, 3) Phần tử loại bỏ: 2
Để tìm hiểu thêm ArrayBlockingQueue
, hãy truy cập Java ArrayBlockingQueue.
Tại sao BlockingQueue?
Trong Java, BlockingQueue
được coi là tập hợp an toàn theo luồng . Đó là bởi vì nó có thể hữu ích trong các hoạt động đa luồng.
Giả sử một luồng đang chèn các phần tử vào hàng đợi và một luồng khác đang xóa các phần tử khỏi hàng đợi.
Bây giờ, nếu luồng đầu tiên chạy chậm hơn, thì hàng đợi chặn có thể khiến luồng thứ hai đợi cho đến khi luồng đầu tiên hoàn thành hoạt động của nó.