Giao diện Java BlockingQueue

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 BlockingQueuegiao diện của Java Collectionskhuôn khổ mở rộng Queuegiao 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

BlockingQueuelà 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.BlockingQueuegó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 ArrayBlockingQueueLinkedBlockingQueuetương ứng. Các đối tượng này có thể sử dụng các chức năng của BlockingQueuegiao 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ề falsenếu hàng đợi đã đầy.
  • peek()- Trả về phần đầu của hàng đợi chặn. Trả về nullnếu hàng đợi trống.
  • poll()- Loại bỏ một phần tử khỏi hàng đợi chặn. Trả về nullnế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()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 100mili 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, microsecondsnanosecondsoffer()poll()phương pháp.

Các phương thức chặn hoạt động

BlockingQueuecũ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ó.

thú vị bài viết...