자바 동시성-BlockingQueue 인터페이스

java.util.concurrent.BlockingQueue 인터페이스는 Queue 인터페이스의 하위 인터페이스이며 요소를 검색하기 전에 큐가 비어 있지 않을 때까지 대기하고 요소를 저장하기 전에 큐에서 공간을 사용할 수있을 때까지 대기하는 등의 작업을 추가로 지원합니다. .

BlockingQueue 메서드

Sr. 아니. 방법 및 설명
1

boolean add(E e)

용량 제한을 위반하지 않고 즉시 수행 할 수있는 경우 지정된 요소를이 큐에 삽입하고, 성공하면 true를 리턴하고 현재 사용 가능한 공간이없는 경우 IllegalStateException을 발생시킵니다.

2

boolean contains(Object o)

이 큐에 지정된 요소가 포함 된 경우 true를 반환합니다.

int drainTo(Collection<? super E> c)

이 큐에서 사용 가능한 모든 요소를 ​​제거하고 지정된 컬렉션에 추가합니다.

4

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

이 큐에서 사용 가능한 요소의 주어진 개수 이하를 제거하고 지정된 컬렉션에 추가합니다.

5

boolean offer(E e)

용량 제한을 위반하지 않고 즉시 수행 할 수있는 경우 지정된 요소를이 큐에 삽입하고 성공하면 true를 반환하고 현재 사용 가능한 공간이 없으면 false를 반환합니다.

6

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

공간을 사용할 수있을 때까지 필요한 경우 지정된 대기 시간까지 대기하면서 지정된 요소를이 큐에 삽입합니다.

7

E poll(long timeout, TimeUnit unit)

요소를 사용할 수있을 때까지 필요한 경우 지정된 대기 시간까지 대기하면서이 큐의 헤드를 검색하고 제거합니다.

8

void put(E e)

공간을 사용할 수있을 때까지 필요한 경우 대기하면서 지정된 요소를이 큐에 삽입합니다.

9

int remainingCapacity()

이 큐가 차단하지 않고 이상적으로 (메모리 또는 리소스 제약이없는 경우) 수용 할 수있는 추가 요소의 수를 반환하거나 고유 한 제한이없는 경우 Integer.MAX_VALUE를 반환합니다.

10

boolean remove(Object o)

이 큐에서 지정된 요소의 단일 인스턴스 (있는 경우)를 제거합니다.

11

E take()

필요한 경우 요소를 사용할 수있을 때까지 대기하면서이 큐의 헤드를 검색하고 제거합니다.

다음 TestThread 프로그램은 스레드 기반 환경에서 BlockingQueue 인터페이스의 사용법을 보여줍니다.

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

그러면 다음과 같은 결과가 생성됩니다.

산출

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