java에서 대기열 차단 BlockingQueue 상세 및 실례

java에서 대기열 차단 BlockingQueue 상세 및 실례
BlockingQueue는 다중 스레드에서 데이터의 전송을 잘 해결했다. 우선 BlockingQueue는 하나의 인터페이스이고 대략 네 가지 실현 클래스가 있다. 이것은 매우 특수한 대기열이다. 만약에 BlockQueue가 비어 있다면 BlockingQueue에서 물건을 찾는 작업은 대기 상태로 들어가는 것을 차단하고 BlockingQueue가 물건에 들어가야 깨어난다.마찬가지로 BlockingQueue가 가득 차면 안에 물건을 저장하려는 모든 작업이 대기 상태로 차단되어 BlockingQueue에 공간이 있을 때까지 계속 작동합니다.
BlockingQueue의 네 가지 구현 클래스:
1. ArrayBlockingQueue: 크기를 지정하는 BlockingQueue, 구조 함수는 int 매개 변수를 가지고 크기를 표시해야 합니다.포함된 객체는 FIFO 순서로 정렬됩니다.
2. LinkedBlockingQueue: 크기가 일정하지 않은 BlockingQueue. 구조 함수에 크기가 정해진 파라미터가 있으면 생성된 BlockingQueue는 크기 제한이 있고 크기 파라미터가 없으면 생성된 BlockingQueue의 크기는 Integer에 의해 제한됩니다.MAX_VALUE가 결정합니다.포함된 객체는 FIFO 순서로 정렬됩니다.
3. Priority BlockingQueue: LinkedBlockQueue와 유사하지만 그 안에 포함된 대상의 정렬은 FIFO가 아니라 대상의 자연 정렬 순서 또는 구조 함수의 Comparator에 따라 결정됩니다.
4. SynchronousQueue: 특수한 BlockingQueue, 그에 대한 조작은 반드시 놓기와 빼기를 교체해서 완성해야 한다.
BlockingQueue의 일반적인 방법:
1)add(anObject): anObject를 BlockingQueue에 추가합니다. 즉, BlockingQueue를 수용할 수 있다면true로 돌아가고, 그렇지 않으면 이상을 보고합니다.
2) offer(anObject): 가능하면 anObject를 BlockingQueue에 추가합니다. 즉, BlockingQueue를 수용할 수 있다면true로 돌아가고, 그렇지 않으면false로 돌아갑니다. 
3)put(anObject): anObject를 BlockingQueue에 추가하고 BlockQueue에 공간이 없으면 이 방법을 호출하는 라인이 BlockingQueue에 공간이 있을 때까지 차단됩니다. 
4)poll(time): BlockingQueue에서 1위를 차지한 대상을 가져가고 즉시 꺼내지 못하면 time 매개 변수가 정한 시간을 기다려서 찾을 수 없을 때null로 돌아갈 수 있습니다
5) take(): BlockingQueue에서 상위 객체를 가져옵니다. BlockingQueue가 비어 있으면 Blocking에 새 객체가 가입될 때까지 대기 상태로 들어가는 것을 차단합니다.
예:
이 예는 주로 생산자와 소비자 간의 작업 절차를 모의했고 간단한 소비자가 생산자가 제품을 생산하여 소비자가 소비하도록 기다리는 장면이다.
생산자:

package com.gefufeng;

import java.util.concurrent.BlockingQueue;

public class Producter implements Runnable{
 private BlockingQueue<String> blockingQueue;
 
 public Producter(BlockingQueue<String> blockingQueue){
 this.blockingQueue = blockingQueue;
 }

 @Override
 public void run() {
 try {
  blockingQueue.put(" " + Thread.currentThread().getName());
  System.out.println(" " + Thread.currentThread().getName());
 } catch (InterruptedException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  System.out.println(" ");
 }
 
 }
 
 

}

소비자:

package com.gefufeng;

import java.util.concurrent.BlockingQueue;

public class Customer implements Runnable{
 private BlockingQueue<String> blockingQueue;
 
 public Customer(BlockingQueue<String> blockingQueue){
 this.blockingQueue = blockingQueue;
 }

 @Override
 public void run() {
 for(;;){
  try {
  String threadName = blockingQueue.take();
  System.out.println(" :" + threadName);
  } catch (InterruptedException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  System.out.println(" ");
  }
 }
 }

}

실행 클래스:

package com.gefufeng;

import java.util.concurrent.ArrayBlockingQueue;

public class Executer {
 
 public static void main(String[] args) {
 ArrayBlockingQueue<String> arrayBlockingQueue = new ArrayBlockingQueue<String>(2);
 Producter producter = new Producter(arrayBlockingQueue);
 Customer cusotmer = new Customer(arrayBlockingQueue);
 new Thread(cusotmer).start();
 for(;;){
  try {
  Thread.sleep(2000);
  new Thread(producter).start();
  } catch (InterruptedException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  }
 }
 
 
 
 }

}

우선 소비자가 제품을 순환하여 기다리고, 첫 번째 순환할 때 BlockingQueue를 실행합니다.take(), 어떤 제품도 꺼내지 못해서 막힌 상태에 들어갔습니다. 2초 후에 생산자가 제품을 생산했습니다. 그래서 BlockingQueue는 제품을 가져와 로그를 출력하고 소비자가 두 번째 순환을 실행하여 BlockingQueue를 발견했습니다.take()는 제품을 받지 못해 막힌 상태로...순서대로 순환하다
읽어주셔서 감사합니다. 여러분에게 도움이 되었으면 좋겠습니다. 여러분, 본 사이트에 대한 지지에 감사드립니다!

좋은 웹페이지 즐겨찾기