Java Eşzamanlılığı - BlockingQueue Arayüzü

Bir java.util.concurrent.BlockingQueue arayüzü, Kuyruk arayüzünün bir alt arayüzüdür ve ek olarak, bir öğeyi almadan önce kuyruğun boş olmasını beklemek ve bir öğeyi depolamadan önce kuyrukta boş yer kalmasını beklemek gibi işlemleri destekler. .

BlockingQueue Yöntemleri

Sr.No. Yöntem ve Açıklama
1

boolean add(E e)

Kapasite kısıtlamalarını ihlal etmeden hemen yapmak mümkünse, belirtilen öğeyi bu kuyruğa ekler, başarı durumunda true döndürür ve şu anda boş alan yoksa IllegalStateException oluşturur.

2

boolean contains(Object o)

Bu kuyruk belirtilen öğeyi içeriyorsa doğru döndürür.

3

int drainTo(Collection<? super E> c)

Mevcut tüm öğeleri bu kuyruktan kaldırır ve verilen koleksiyona ekler.

4

int drainTo(Collection<? super E> c, int maxElements)

Bu kuyruktan en fazla verilen sayıda kullanılabilir öğeyi kaldırır ve bunları verilen koleksiyona ekler.

5

boolean offer(E e)

Kapasite kısıtlamalarını ihlal etmeden hemen yapılması mümkünse, belirtilen öğeyi bu kuyruğa ekler, başarı durumunda true ve şu anda kullanılabilir alan yoksa false döndürür.

6

boolean offer(E e, long timeout, TimeUnit unit)

Alanın kullanılabilir hale gelmesi için gerekirse belirtilen bekleme süresine kadar belirtilen öğeyi bu kuyruğa ekler.

7

E poll(long timeout, TimeUnit unit)

Bu kuyruğun başını alır ve kaldırır, eğer gerekliyse bir elemanın kullanılabilir hale gelmesi için belirtilen bekleme süresine kadar bekler.

8

void put(E e)

Belirtilen öğeyi bu kuyruğa ekler, gerekirse alanın kullanılabilir olmasını bekler.

9

int remainingCapacity()

Bu kuyruğun ideal olarak (bellek veya kaynak kısıtlamalarının yokluğunda) engellemeden kabul edebileceği ek öğe sayısını veya iç sınır yoksa Tamsayı.MAX_VALUE değerini döndürür.

10

boolean remove(Object o)

Varsa, belirtilen öğenin tek bir örneğini bu kuyruktan kaldırır.

11

E take()

Bu kuyruğun başını alır ve kaldırır, gerekirse bir öğe kullanılabilir olana kadar bekler.

Misal

Aşağıdaki TestThread programı, iş parçacığı tabanlı ortamda BlockingQueue arayüzünün kullanımını göstermektedir.

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();
         }
      }
   }
}

Bu, aşağıdaki sonucu verecektir.

Çıktı

Added: 52
Removed: 52
Added: 70
Removed: 70
Added: 27
Removed: 27