Trong bài này, chúng ta sẽ tìm hiểu về class ArrayBlockingQueue và các hàm của nó qua các ví dụ.
Class ArrayBlockingQueue của Collections framework trong Java triển khai blocking queue bằng cách sử dụng mảng.
Nó triển khai BlockingQueue interface trong Java .
Nội dung chính
1. Tạo ArrayBlockingQueue
Để tạo một ArrayBlockingQueue, chúng ta phải nhập gói java.util.concurrent.ArrayBlockingQueue.
Khi chúng ta đã nhập gói, sau đây là cách chúng ta có thể tạo ArrayBlockingQueue trong Java:
ArrayBlockingQueue<Type> animal = new ArrayBlockingQueue<>(int capacity);
Ở đây,
- Type – kiểu dữ liệu của ArrayBlockingQueue
- Capacity – kích thước của ArrayBlockingQueue
Ví dụ,
// Creating String type ArrayBlockingQueue with size 5
ArrayBlockingQueue<String> animals = new ArrayBlockingQueue<>(5);
// Creating Integer type ArrayBlockingQueue with size 5
ArrayBlockingQueue<Integer> age = new ArrayBlockingQueue<>(5);
Lưu ý: Bắt buộc phải cung cấp kích thước của mảng.
2. Các hàm của ArrayBlockingQueue
Class ArrayBlockingQueue triển khai tất cả các hàm trong BlockingQueue interface.
Các hàm này được sử dụng để chèn, truy cập và xóa các phần tử khỏi ArrayBlockingQueue.
Ngoài ra, chúng ta sẽ tìm hiểu về hai hàm put() và take(), hai hàm này hỗ trợ thao tác chặn trong ArrayBlockingQueue.
Hai hàm này phân biệt ArrayBlockingQueue với các queue điển hình khác.
2.1 Chèn các phần tử
- add()- Chèn phần tử được chỉ định vào ArrayBlockingQueue. Nó ném một ngoại lệ nếu queue đã đầy.
- offer()- Chèn phần tử được chỉ định vào ArrayBlockingQueue. Nó trả về false nếu queue đã đầy.
Ví dụ,
import java.util.concurrent.ArrayBlockingQueue;
class Main {
public static void main(String[] args) {
ArrayBlockingQueue<String> animals = new ArrayBlockingQueue<>(5);
// Using add()
animals.add("Dog");
animals.add("Cat");
// Using offer()
animals.offer("Horse");
System.out.println("ArrayBlockingQueue: " + animals);
}
}
Kết quả
ArrayBlockingQueue: [Dog, Cat, Horse]
2.2 Truy cập tới các phần tử
- peek()- Trả về một phần tử từ phần đầu của ArrayBlockingQueue. Nó trả về null nếu queue trống.
- iterator()- Trả về một đối tượng lặp để truy cập tuần tự các phần tử của ArrayBlockingQueue. Nó ném một ngoại lệ nếu queue trống. Chúng ta phải nhập gói java.util.Iterator để sử dụng nó.
Ví dụ,
import java.util.concurrent.ArrayBlockingQueue;
import java.util.Iterator;
class Main {
public static void main(String[] args) {
ArrayBlockingQueue<String> animals = new ArrayBlockingQueue<>(5);
// Add elements
animals.add("Dog");
animals.add("Cat");
animals.add("Horse");
System.out.println("ArrayBlockingQueue: " + animals);
// Using peek()
String element = animals.peek();
System.out.println("Accessed Element: " + element);
// Using iterator()
Iterator<String> iterate = animals.iterator();
System.out.print("ArrayBlockingQueue Elements: ");
while(iterate.hasNext()) {
System.out.print(iterate.next());
System.out.print(", ");
}
}
}
Kết quả
ArrayBlockingQueue: [Dog, Cat, Horse]
Accessed Element: Dog
ArrayBlockingQueue Elements: Dog, Cat, Horse,
2.3 Loại bỏ các phần tử
- remove()- Trả về và xóa một phần tử đã chỉ định khỏi ArrayBlockingQueue. Nó ném một ngoại lệ nếu queue trống.
- poll()- Trả về và xóa một phần tử đã chỉ định khỏi ArrayBlockingQueue. Nó trả về null nếu queue trống.
- clear() – Loại bỏ tất cả các phần tử khỏi ArrayBlockingQueue.
Ví dụ,
import java.util.concurrent.ArrayBlockingQueue;
class Main {
public static void main(String[] args) {
ArrayBlockingQueue<String> animals = new ArrayBlockingQueue<>(5);
animals.add("Dog");
animals.add("Cat");
animals.add("Horse");
System.out.println("ArrayBlockingQueue: " + animals);
// Using remove()
String element1 = animals.remove();
System.out.println("Removed Element:");
System.out.println("Using remove(): " + element1);
// Using poll()
String element2 = animals.poll();
System.out.println("Using poll(): " + element2);
// Using clear()
animals.clear();
System.out.println("Updated ArrayBlockingQueue: " + animals);
}
}
Kết quả
ArrayBlockingQueue: [Dog, Cat, Horse]
Removed Elements:
Using remove(): Dog
Using poll(): Cat
Updated ArrayBlockingQueue: []
3. Hàm put () và take ()
Trong các quá trình đa luồng, chúng ta có thể sử dụng put()và take() để chặn thao tác của một luồng để đồng bộ hóa nó với một luồng khác. Các hàm này sẽ đợi cho đến khi chúng có thể được thao tác thành công.
3.1 Hàm put ()
Để thêm một phần tử vào cuối ArrayBlockingQueue, chúng ta có thể sử dụng hàm put().
Nếu ArrayBlockingQueue đã đầy, nó sẽ đợi cho đến khi có khoảng trống trong ArrayBlockingQueue để thêm một phần tử.
Ví dụ,
import java.util.concurrent.ArrayBlockingQueue;
class Main {
public static void main(String[] args) {
ArrayBlockingQueue<String> animals = new ArrayBlockingQueue<>(5);
try {
// Add elements to animals
animals.put("Dog");
animals.put("Cat");
System.out.println("ArrayBlockingQueue: " + animals);
}
catch(Exception e) {
System.out.println(e);
}
}
}
Kết quả
ArrayBlockingQueue: [Dog, Cat]
Ở đây, hàm put()có thể ném InterruptedException nếu nó bị gián đoạn trong khi chờ đợi. Do đó, chúng ta phải đặt nó bên trong một khối try..catch .
3.2 Hàm take()
Để trả về và loại bỏ một phần tử từ phía trước ArrayBlockingQueue, chúng ta có thể sử dụng hàm take().
Nếu ArrayBlockingQueue trống, nó sẽ đợi cho đến khi có các phần tử trong ArrayBlockingQueue để có thể xóa.
Ví dụ,
import java.util.concurrent.ArrayBlockingQueue;
class Main {
public static void main(String[] args) {
ArrayBlockingQueue<String> animals = new ArrayBlockingQueue<>(5);
try {
//Add elements to animals
animals.put("Dog");
animals.put("Cat");
System.out.println("ArrayBlockingQueue: " + animals);
// Remove an element
String element = animals.take();
System.out.println("Removed Element: " + element);
}
catch(Exception e) {
System.out.println(e);
}
}
}
Kết quả
ArrayBlockingQueue: [Dog, Cat]
Removed Element: Dog
Ở đây, hàm take()sẽ ném một InterrupedException nếu nó bị gián đoạn trong khi chờ đợi. Do đó, chúng ta phải đặt nó bên trong một khối try…catch.
4. Các hàm khác
Hàm | Mô tả |
contains(element) | Tìm kiếm trong ArrayBlockingQueue một phần tử được chỉ định. Nếu phần tử được tìm thấy, nó trả về true, nếu không thì nó trả về false. |
size() | Trả về độ dài của ArrayBlockingQueue. |
toArray() | Chuyển đổi ArrayBlockingQueue thành một mảng và trả về nó. |
toString() | Chuyển đổi ArrayBlockingQueue thành chuỗi |
5. Tại sao nên sử dụng ArrayBlockingQueue?
ArrayBlockingQueue sử dụng mảng như lưu trữ nội bộ của nó.
Nó được coi là một collection an toàn luồng. Do đó, nó thường được sử dụng trong các ứng dụng đa luồng.
Giả sử, một luồng đang chèn các phần tử vào queue và một luồng khác đang xóa các phần tử khỏi queue.
Bây giờ, nếu luồng đầu tiên chậm hơn luồng thứ hai, thì ArrayBlockingQueue có thể làm cho luồng thứ hai chờ cho đến khi luồng đầu tiên hoàn thành các thao tác của nó.