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 thức 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 đợ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ì 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<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 ArrayBlockingQueuevà LinkedBlockingQueuetươ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 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. Returns false if the queue is full.
  • peek() – Returns the head of the blocking queue. Returns null if the queue is empty.
  • poll() – Removes an element from the blocking queue. Returns null 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 100mili 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: dayshoursminutessecondsmicrosecondsvà nanosecondsở offer()và poll()phương pháp.

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

Nó 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() – 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ó.









Gõ tìm kiếm nhanh...