BlockingQueue trong Java là gì và làm thế nào để triển khai nó?



Bài viết này về BlockingQueue trong Java sẽ giúp bạn tìm hiểu về giao diện BlockingQueue. Nó cũng sẽ cung cấp cho bạn những hiểu biết sâu sắc về các phương pháp và cách triển khai thực tế

được các lập trình viên cực kỳ ưa chuộng vì tính năng tích hợp toàn diện của nó. Hầu hết các trường hợp bạn sẽ có một giải pháp dành riêng cho vấn đề của mình ngay cả trước khi nó xuất hiện. Đó là một phần cực kỳ hữu ích và quan trọng của là giao diện BlockingQueue trong Java. Thông qua phương tiện của bài viết này, tôi sẽ giới thiệu một số điều về BlockingQueue trong Java và các phương pháp để thực hiện nó.

Dưới đây là các chủ đề được đề cập trong bài viết này:





Giao diện BlockingQueue trong Java

BlockingQueue trong Java là một giao diện đã được thêm vào trong Java 1.5 cùng với một số lớp Tiện ích đồng thời khác như ConcurrentHashMap, CopyOnWriteArrrayList, v.v. Giao diện BlockingQueue thuộc về java.util.concurrent gói hàng .Giao diện này tăng cường khả năng kiểm soát luồng bằng cách kích hoạt tính năng chặn, trong trường hợp một luồng đang cố gắng xếp hàng đợi trống hoặc xếp hàng đợi đầy đủ. Trong cả hai trường hợp, giao diện này có ích.Nói một cách đơn giản hơn, giả sử đang cố gắng thêm các phần tử vào một hàng đợi đã đầy đủ. Tại thời điểm này trong chương trình, BlockingQueue sẽ được gọi ra sẽ chặn luồng cụ thể đó cho đến khi một luồng khác giải phóng hàng đợi để tạo khoảng trống. Điều này có thể là kết quả của việc phá hủy (các) phần tử của toàn bộ hàng đợi. Tương tự, BlockingQueue sẽ được gọi để chặn một luồng đang cố gắng xếp hàng đợi đã trống cho đến khi một số luồng khác chèn hoặc thêm một phần tử vào khoảng trống xếp hàng .

dòng goto c ++

Trong khi làm việc với giao diện BlockingQueue trong Java, bạn phải nhớ rằng nó không chấp nhận giá trị null. Trong trường hợp bạn cố gắng làm điều đó, nó sẽ ngay lập tức ném ra một NullPointerException. Hình dưới đây mô tả hoạt động của giao diện BlockingQueue trong Java.



BlockingQueue - BlockingQueue trong Java - EdurekaĐiều này giao diện chủ yếu được sử dụng giữa Nhà sản xuất-Người tiêu dùng vì nó là Chủ đề-An toàn.Ý tôi là giao diện BlockingQueue có thể được sử dụng để tạo một hàng đợi có thể được chia sẻ bởi cả người sản xuất và người tiêu dùng

Để làm việc với BlockingQueue trong Java, trước tiên, bạn cần làm quen với các kiểu của nó. Hãy để tôi giới thiệu với bạn về chúng trong phần tiếp theo của bài viết này.

Các loại cấu tạo cho BlockingQueue trong Java

Có hai loại hàm tạo cho giao diện BlockingQueue trong Java:



đọc và ghi tệp excel trong java
  • Hàng đợi không giới hạn: Đối với loại hàng đợi này, dung lượng sẽ được đặt thành Integer.MAX_VALUE. Một hàng đợi không bị ràng buộc sẽ không bao giờ bị chặn vì nó có thể phát triển động, mỗi khi một phần tử được chèn vào nó. Dưới đây là cú pháp để tạo một hàng đợi không bị ràng buộc:
BlockingQueue bq = new LinkedBlockingDeque ()
  • Hàng đợi có Giới hạn: Đối với loại hàng đợi này, bạn cần phải vượt qua sức chứa của hàng đợi tại thời điểm tạo nó, tức là người xây dựng tham số. Khi kích thước đã được chỉ định, nó không thể thay đổi được. Dưới đây là cú pháp để tạo một hàng đợi có giới hạn:
BlockingQueue bq = new LinkedBlockingDeque (10)

Bây giờ bạn đã quen với các cách triển khai BlockingQueue trong Java, hãy để tôi liệt kê một vài phương pháp của nó.

Các phương thức trong giao diện BlockingQueue

phương pháp Sự miêu tả
boolean add (E e) Phương thức này giúp chèn phần tử được chỉ định vào hàng đợi này nếu có khoảng trống trong hàng đợi nếu không nó sẽném mộtNgoại lệ nhà nước bất hợp pháp
boolean chứa (Đối tượng o) Phương thức này trả về true nếu hàng đợi chứa phần tử được chỉ định
int draTo (Bộ sưu tập c) Phương thức này sẽ xóa tất cả các phần tử có sẵn khỏi hàng đợi và thêm chúng vào bộ sưu tập được chỉ định
int cốngTo (Bộ sưu tập c, int maxElements) Phương thức này sẽ xóa với số lượng nhất định các phần tử có sẵn khỏi hàng đợi và thêm chúng vào phần tử được chỉ định
đề nghị booloean (E e) Phương thức này sẽ chèn phần tử được chỉ định vào hàng đợi nếu nó chưa đầy và trả về true, nếu không nó sẽ trả về false
ưu đãi boolean (E e, thời gian chờ lâu, đơn vị TimeUnit) Phương thức này sẽ chèn phần tử được chỉ định vào hàng đợi. Trong trường hợp hàng đợi đã đầy, nó sẽ đợi đến thời gian chờ được chỉ định để có chỗ trống.
Thăm dò ý kiến ​​E (thời gian chờ lâu, đơn vị TimeUnit) Phương pháp này giúp truy xuất và loại bỏ phần đầu của hàng đợi. Trong trường hợp hàng đợi trống, nó sẽ đợi đến thời gian chờ được chỉ định để một phần tử có sẵn
void put (E e) Phương thức này sẽ chèn phần tử được chỉ định vào hàng đợi bằng cách đợi khoảng trống có sẵn n trong trường hợp hàng đợi đầy
int còn lạiCapacity () Phương thức này giúp trả về số lượng phần tử bổ sung mà hàng đợi này lý tưởng có thể chấp nhận mà không bị chặn
boolean remove (Đối tượng o) Phương thức này sẽ loại bỏ một trường hợp duy nhất của phần tử được chỉ định khỏi hàng đợi chỉ khi nó có mặt
E lấy () Phương thức này sẽ giúp truy xuất và loại bỏ phần đầu của hàng đợi bằng cách đợi một phần tử trở nên khả dụng, trong trường hợp hàng đợi trống.

Triển khai BlockingQueue

Ở đây tôi sẽ triển khai một ví dụ đơn giản về BlockingQueue trong Java, nơilớp học EduProductioner sẽ tạo dữ liệu và chèn nó vào xếp hàng , đồng thời, một lớp khác, EduConsumer sẽ xóa dữ liệu khỏi cùng một hàng đợi.

Đối với điều này, tôi sẽ tạo 3 lớp cụ thể là:

  1. EduProductioner
  2. EduConsumer
  3. EdurekaMain

Bây giờ chúng ta hãy tạo từng lớp một.

EduProductioner.java

package edureka import java.util.concurrent.BlockingQueue public class EduProductioner triển khai Runnable {private final BlockingQueue queue @Override public void run () {try {process ()} catch (InterruptException e) {Thread.currentThread (). ngắt ()} } private void process () ném InterruptException {// Đặt 10 int vào Queue for (int i = 0 i<10 i++) { System.out.println('[Producer] Add : ' + i) queue.put(i) System.out.println('[Producer] Queue's Remaining Capacity : ' + queue.remainingCapacity()) Thread.sleep(150) } } public EduProducer(BlockingQueue queue) { this.queue = queue } }

EduConsumer.java

package edureka import java.util.concurrent.BlockingQueue public class EduConsumer triển khai Runnable {private final BlockingQueue queue @Override public void run () {try {while (true) {Integer take = queue.take () process (take)}} bắt (InterruptException e) {Thread.currentThread () .rupt ()}} quá trình private void (Integer take) ném InterruptException {System.out.println ('[Consumer] Remove:' + take) Thread.sleep (500)} public EduConsumer (Hàng đợi BlockingQueue) {this.queue = queue}}

EdurekaMain.java

package edureka import java.util.concurrent.BlockingQueue import java.util.concurrent.LinkedBlockingQueue public class EdurekaMain {public static void main (String [] args) {BlockingQueue queue = new LinkedBlockingQueue (10) new Thread (new EduProductioner (hàng đợi)) .start () new Thread (new EduConsumer (queue)). start ()}}

Sau khi bạn viết xong mã, hãy thực thi chương trình để nhận kết quả bên dưới:

ví dụ về goto c ++
[Nhà sản xuất] Thêm: 0 [Người tiêu dùng] Lấy: 0 [Nhà sản xuất] Năng lực còn lại của hàng đợi: 9 [Nhà sản xuất] Thêm: 1 [Nhà sản xuất] Năng lực còn lại của hàng đợi: 9 [Nhà sản xuất] Thêm: 2 [Nhà sản xuất] Khả năng còn lại của hàng đợi: 8 [Nhà sản xuất ] Thêm: 3 [Nhà sản xuất] Dung lượng còn lại của hàng đợi: 7 [Người tiêu dùng] Lấy: 1 [Nhà sản xuất] Thêm: 4 [Nhà sản xuất] Dung lượng còn lại của hàng đợi: 7 [Nhà sản xuất] Thêm: 5 [Nhà sản xuất] Dung lượng còn lại của hàng đợi: 6 [Nhà sản xuất] Thêm : 6 [Nhà sản xuất] Dung lượng còn lại của hàng đợi: 5 [Người tiêu dùng] Lấy: 2 [Nhà sản xuất] Thêm: 7 [Nhà sản xuất] Dung lượng còn lại của hàng đợi: 5 [Nhà sản xuất] Thêm: 8 [Nhà sản xuất] Dung lượng còn lại của hàng đợi: 4 [Nhà sản xuất] Thêm: 9 [Nhà sản xuất] Khả năng còn lại của hàng đợi: 3 [Người tiêu dùng] Lấy: 3 [Người tiêu dùng] Lấy: 4 [Người tiêu dùng] Lấy: 5 [Người tiêu dùng] Lấy: 6 [Người tiêu dùng] Lấy: 7 [Người tiêu dùng] Lấy: 8 [Người tiêu dùng] Lấy: 9

Chúng ta đến phần cuối của bài viết này về BlockingQueue trong Java. Nếu bạn muốn học Java chi tiết hơn, bạn có thể tham khảo cũng.

Bây giờ bạn đã hiểu cơ bản về BlockingQueue trong Java, hãy xem của Edureka, một công ty học trực tuyến đáng tin cậy với mạng lưới hơn 250.000 người học hài lòng trải dài trên toàn cầu. Khóa học Chứng chỉ và Đào tạo Java J2EE và SOA của Edureka được thiết kế cho sinh viên và các chuyên gia muốn trở thành Nhà phát triển Java. Khóa học được thiết kế để cung cấp cho bạn khởi đầu về Lập trình Java và đào tạo bạn về cả khái niệm Java cốt lõi và nâng cao cùng với các khung Java khác nhau như Hibernate & Spring.

Có một câu hỏi cho chúng tôi? Vui lòng đề cập đến nó trong phần nhận xét của “BlockingQueue trong Java” này và chúng tôi sẽ liên hệ lại với bạn sớm nhất có thể.