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 thức 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 đợi 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<String> animal1 = new ArraryBlockingQueue<>();
// LinkedList implementation of BlockingQueue
BlockingQueue<String> animal2 = new LinkedBlockingQueue<>();
Ở đây, chúng tôi đã 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 ra một ngoại lệ
add()
– Inserts an element to the blocking queue at the end of the queue. Throws an exception if the queue is full.element()
– Returns the head of the blocking queue. Throws an exception if the queue is empty.remove()
– Removes an element from the blocking queue. Throws an exception if the queue is empty.
Các phương thức trả về một số giá trị
offer()
– Inserts the specified element to the blocking queue at the end of the queue. Returnsfalse
if the queue is full.peek()
– Returns the head of the blocking queue. Returnsnull
if the queue is empty.poll()
– Removes an element from the blocking queue. Returnsnull
if the queue is empty.
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,
- value is the element to be inserted to the queue
- And we have set a timeout of 100 milliseconds
Đ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 phần tử không thể được chèn 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()
– Inserts an element to the blocking queue. If the queue is full, it will wait until the queue has space to insert an element.take()
– Removes and returns an element from the blocking queue. If the queue is empty, it will wait until the queue has elements to be deleted.
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<Integer> 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] Removed Element: 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ó.