Hướng dẫn và ví dụ Java ArrayBlockingQueue
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
- Collection
- BlockingQueue
- Queue
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 Producer và Consumer đ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.
ArrayBlockingQueue và Iterator của nó hỗ trợ tất cả các phương thức tuỳ chọn được định nghĩa trong interface Collection và Iterator.
- Iterator
- Collection
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 Producer và Consumer đ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()
- Hướng dẫn và ví dụ Java Collection
- Hướng dẫn và ví dụ Java Iterator
Các hướng dẫn Java Collections Framework
- Hướng dẫn và ví dụ Java PriorityBlockingQueue
- Hướng dẫn sử dụng nền tảng tập hợp trong Java (Java Collection Framework)
- Hướng dẫn và ví dụ Java SortedSet
- Hướng dẫn và ví dụ Java List
- Hướng dẫn và ví dụ Java Iterator
- Hướng dẫn và ví dụ Java NavigableSet
- Hướng dẫn và ví dụ Java ListIterator
- Hướng dẫn và ví dụ Java ArrayList
- Hướng dẫn và ví dụ Java CopyOnWriteArrayList
- Hướng dẫn và ví dụ Java LinkedList
- Hướng dẫn và ví dụ Java Set
- Hướng dẫn và ví dụ Java TreeSet
- Hướng dẫn và ví dụ Java CopyOnWriteArraySet
- Hướng dẫn và ví dụ Java Queue
- Hướng dẫn và ví dụ Java Deque
- Hướng dẫn và ví dụ Java IdentityHashMap
- Hướng dẫn và ví dụ Java WeakHashMap
- Hướng dẫn và ví dụ Java Map
- Hướng dẫn và ví dụ Java SortedMap
- Hướng dẫn và ví dụ Java NavigableMap
- Hướng dẫn và ví dụ Java HashMap
- Hướng dẫn và ví dụ Java TreeMap
- Hướng dẫn và ví dụ Java PriorityQueue
- Hướng dẫn và ví dụ Java BlockingQueue
- Hướng dẫn và ví dụ Java ArrayBlockingQueue
- Hướng dẫn và ví dụ Java TransferQueue
Show More