Java Concurrency - Giao diện BlockingQueue
Giao diện java.util.concurrent.BlockingQueue là giao diện con của giao diện Hàng đợi và hỗ trợ thêm các hoạt động như đợi hàng đợi trở nên trống trước khi truy xuất một phần tử và đợi cho đến khi có khoảng trống trong hàng đợi trước khi lưu trữ một phần tử .
Phương thức BlockingQueue
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | boolean add(E e) Chèn phần tử đã chỉ định vào hàng đợi này nếu có thể làm như vậy ngay lập tức mà không vi phạm các giới hạn dung lượng, trả về true khi thành công và ném IllegalStateException nếu hiện không có dung lượng. |
2 | boolean contains(Object o) Trả về true nếu hàng đợi này chứa phần tử được chỉ định. |
3 | int drainTo(Collection<? super E> c) Xóa tất cả các phần tử có sẵn khỏi hàng đợi này và thêm chúng vào bộ sưu tập đã cho. |
4 | int drainTo(Collection<? super E> c, int maxElements) Loại bỏ tối đa số phần tử có sẵn đã cho khỏi hàng đợi này và thêm chúng vào bộ sưu tập đã cho. |
5 | boolean offer(E e) Chèn phần tử được chỉ định vào hàng đợi này nếu có thể làm như vậy ngay lập tức mà không vi phạm các giới hạn dung lượng, trả về true khi thành công và false nếu hiện không còn chỗ trống. |
6 | boolean offer(E e, long timeout, TimeUnit unit) Chèn phần tử được chỉ định vào hàng đợi này, đợi đến thời gian chờ được chỉ định nếu cần thiết để có dung lượng. |
7 | E poll(long timeout, TimeUnit unit) Truy xuất và loại bỏ phần đầu của hàng đợi này, chờ đến thời gian chờ được chỉ định nếu cần thiết để một phần tử có sẵn. |
số 8 | void put(E e) Chèn phần tử đã chỉ định vào hàng đợi này, đợi nếu cần thiết để có dung lượng. |
9 | int remainingCapacity() Trả về số phần tử bổ sung mà hàng đợi này lý tưởng có thể chấp nhận (trong trường hợp không có bộ nhớ hoặc ràng buộc tài nguyên) mà không bị chặn hoặc Integer.MAX_VALUE nếu không có giới hạn nội tại. |
10 | boolean remove(Object o) Loại bỏ một phiên bản của phần tử được chỉ định khỏi hàng đợi này, nếu nó có mặt. |
11 | E take() Lấy và xóa phần đầu của hàng đợi này, đợi nếu cần cho đến khi một phần tử có sẵn. |
Thí dụ
Chương trình TestThread sau đây cho thấy cách sử dụng giao diện BlockingQueue trong môi trường dựa trên luồng.
import java.util.Random;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
public class TestThread {
public static void main(final String[] arguments) throws InterruptedException {
BlockingQueue<Integer> queue = new ArrayBlockingQueue<Integer>(10);
Producer producer = new Producer(queue);
Consumer consumer = new Consumer(queue);
new Thread(producer).start();
new Thread(consumer).start();
Thread.sleep(4000);
}
static class Producer implements Runnable {
private BlockingQueue<Integer> queue;
public Producer(BlockingQueue queue) {
this.queue = queue;
}
@Override
public void run() {
Random random = new Random();
try {
int result = random.nextInt(100);
Thread.sleep(1000);
queue.put(result);
System.out.println("Added: " + result);
result = random.nextInt(100);
Thread.sleep(1000);
queue.put(result);
System.out.println("Added: " + result);
result = random.nextInt(100);
Thread.sleep(1000);
queue.put(result);
System.out.println("Added: " + result);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
static class Consumer implements Runnable {
private BlockingQueue<Integer> queue;
public Consumer(BlockingQueue queue) {
this.queue = queue;
}
@Override
public void run() {
try {
System.out.println("Removed: " + queue.take());
System.out.println("Removed: " + queue.take());
System.out.println("Removed: " + queue.take());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Điều này sẽ tạo ra kết quả sau.
Đầu ra
Added: 52
Removed: 52
Added: 70
Removed: 70
Added: 27
Removed: 27