openplanning

Hướng dẫn và ví dụ Java ArrayBlockingQueue

Xem thêm các chuyên mục:

Hãy theo dõi chúng tôi trên Fanpage để nhận được thông báo mỗi khi có bài viết mới. Facebook

1- ArrayBlockingQueue

ArrayBlockingQueue<E> là một lớp thi hành interface BlockingQueue<E>, nên nó có đầy đủ các đặc điểm của interface này. Xem thêm bài viết về BlockingQueue để hiểu chi tiết hơn với các ví dụ cơ bản.

public class ArrayBlockingQueue<E> extends AbstractQueue<E>
                          implements BlockingQueue<E>, java.io.Serializable
ArrayBlockingQueue là một hàng đợi có dung lượng giới hạn, nó chứa một mảng nội bộ với độ dài cố định để lưu trữ các phần tử. Hàng đợi này sắp xếp các phần tử theo quy tắc FIFO - First In First Out (Vào trước ra trước). Các phần tử đứng ở đầu hàng đợi là các phần tử đã ở trong hàng đợi lâu nhất, các phần tử ở đuôi hàng đợi là các phần tử mới được thêm vào.
Hình dưới đây minh hoạ cách ArrayBlockingQueue lưu trữ các phần tử của nó trên mảng nội bộ.
  • Việc thêm một phần tử mới vào hàng đợi này tương ứng với việc gán giá trị mới cho phần tử của mảng tại chỉ số putIndex. Ngoài ra, nếu putIndex bằng 0 nó sẽ được gán thành arrayLength-1, ngược lại nó sẽ được gán thành putIndex-1.
  • Việc lấy một phần tử ra khỏi hàng đợi này tương ứng với việc trả về phần tử của mảng tại chỉ số takeIndex. Ngoài ra, nếu takeIndex bằng 0 nó sẽ được gán thành arrayLength-1, ngược lại nó sẽ được gán thành takeIndex-1.
ArrayBlockingQueue hỗ trợ chính sách công bằng như một tuỳ chọn khi tạo đối tượng. Một khi chính sách công bằng được sử dụng, hàng đợi này sẽ tôn trọng thứ tự các thread ProducerConsumer đang chờ đợi. Điều này tránh tình trạng chết đói của một thread nào đó, chẳng hạn một thread Consumer bị chết đói vì chờ rất lâu mà không nhận được một phần tử nào từ hàng đợi.
ArrayBlockingQueueIterator của nó hỗ trợ tất cả các phương thức tuỳ chọn được định nghĩa trong interface CollectionIterator.

2- Constructors

Các constructor của lớp ArrayBlockingQueue:

public ArrayBlockingQueue(int capacity)  
public ArrayBlockingQueue(int capacity, boolean fair)  
public ArrayBlockingQueue(int capacity, boolean fair, Collection<? extends E> c)

3- ArrayBlockingQueue(int)


public ArrayBlockingQueue(int capacity)  
Tạo ra một đối tượng ArrayBlockingQueue với dung lượng được chỉ định (cố định). Việc sử dụng constructor này tương đương với sử dụng constructor ArrayBlockingQueue(capacity,false).
Chính sách "công bằng" không được áp dụng đối với đối tượng ArrayBlockingQueue được tạo ra bởi constructor này, hành vi của nó không được xác định.

4- ArrayBlockingQueue(int, boolean)


public ArrayBlockingQueue(int capacity, boolean fair)  
Tạo ra một đối tượng ArrayBlockingQueue với dung lượng được chỉ định (cố định), với chính sách "công bằng" được chỉ định.
fair = true
Chính sách "công bằng" sẽ được áp dụng cho hàng đợi này, nó tôn trọng thứ tự các thread ProducerConsumer đang chờ đợi theo quy tắc FIFO, nghĩa là thread nào đợi trước sẽ được xử lý trước.
Chính sách "công bằng" giúp tránh tình trạng chết đói của một thread nào đó, chẳng hạn một Consumer chờ rất lâu nhưng không nhận được phần tử nào từ hàng đợi.
fair = false
Chính sách "công bằng" không được áp dụng dụng, thứ tự cho việc xử lý các thread là không được xác định.

5- ArrayBlockingQueue(int, boolean, Collection)


public ArrayBlockingQueue(int capacity, boolean fair, Collection<? extends E> c)
Tạo ra một đối tượng ArrayBlockingQueue với dung lượng được chỉ định (cố định), chính sách "công bằng" được chỉ định, và các phần tử ban đầu được cung cấp.
Ví dụ:

Collection<String> initialElements = List.of("A", "B", "C");
BlockingQueue<String> queue = new ArrayBlockingQueue<>(10, true, initialElements);

6- Methods

Các phương thức được thừa kế từ interface BockingQueue<E>:

void put(E e) throws InterruptedException;
boolean offer(E e, long timeout, TimeUnit unit) throws InterruptedException;
E take() throws InterruptedException;
E poll(long timeout, TimeUnit unit) throws InterruptedException;
int remainingCapacity();
int drainTo(Collection<? super E> c);  
int drainTo(Collection<? super E> c, int maxElements);
Xem bài viết về BlockingQueue để tìm hiểu cách sử dụng các phương thức trên.
Các phương thức được thừa kế từ interface Queue<E>:

boolean add(E e);
boolean offer(E e);
E remove();
E poll();
E element();
E peek();
Các phương thức được thừa kế từ interface Collection<E>:

int size();
boolean isEmpty();
boolean contains(Object o);
Iterator<E> iterator();
Object[] toArray();
<T> T[] toArray(T[] a);
boolean add(E e);
boolean remove(Object o);
boolean containsAll(Collection<?> c);  
boolean addAll(Collection<? extends E> c);
boolean removeAll(Collection<?> c);
boolean retainAll(Collection<?> c);
void clear();  
boolean equals(Object o);
int hashCode();

default <T> T[] toArray(IntFunction<T[]> generator)  
default boolean removeIf(Predicate<? super E> filter)
default Spliterator<E> spliterator()  
default Stream<E> stream()  
default Stream<E> parallelStream()
  • TODO Link?

Xem thêm các chuyên mục: