자바 병렬 프로 그래 밍 도구 류 JUC 의 Array BlockingQueue

자바 BlockingQueue 인터페이스 자바.util.concurrent.BlockingQueue 는 요 소 를 액세스 할 수 있 고 스 레 드 가 안전 한 대기 열 을 표시 합 니 다.다시 말 하면 다 중 스 레 드 가 자바 BlockingQueue 에서 요 소 를 삽입 하고 요 소 를 가 져 올 때 어떠한 병행 문제 도 발생 하지 않 는 다(요소 가 여러 번 삽입 되 고 여러 번 처리 되 는 등 문제).
자바 BlockingQueue 에서 하나의 개념 을 설명 할 수 있 습 니 다.대기 열 을 막 는 것 은 대기 열 자체 가 스 레 드 를 막 아 대기 열 에 요 소 를 삽입 하거나 스 레 드 를 막 아 대기 열 에서 요 소 를 가 져 오 는 것 을 말 합 니 다.예 를 들 어 하나의 스 레 드 가 빈 대기 열 에서 요 소 를 가 져 오 려 고 시도 할 때 이 스 레 드 는 대기 열 에 있 는 요소 의 수량 이 더 이상 비어 있 지 않 을 때 까지 막 힐 것 입 니 다.물론 스 레 드 가 막 히 는 지 여 부 는 BlockingQueue 에서 요 소 를 얻 는 방법 에 달 려 있 습 니 다.어떤 방법 은 스 레 드 를 막 을 수 있 고 어떤 방법 은 이상 을 던 질 수 있 습 니 다.다음 글 은 저희 가 상세 하 게 소개 하 겠 습 니 다.
클래스ArrayBlockingQueueBlockingQueue인터페이스의 실현 클래스 로 경계 가 있 는 차단 대기 열 이 고 내부 에 배열 로 대기 열 요 소 를 저장 합 니 다.이곳 의'유 계'는 저장 용량 에 상한 선 이 있어 원 소 를 무한 저장 할 수 없다 는 것 을 말한다.같은 시간 에 메모리 저장 용량 에 상한 값 이 존재 합 니 다.이 는 초기 예화 할 때 지정 한 것 으로 제한 되 어 있 으 며 그 후에 수정 할 수 없습니다.ArrayBlockingQueue내 부 는 FIFO(First In,First Out)의 선진 적 인 방법 으로 대기 열 데이터 의 접근 을 실현 합 니 다.팀 의 첫 번 째 요 소 는 대기 열 에 가장 오래 저 장 된 요소 대상 이 고 팀 끝의 요 소 는 대기 열 에 가장 짧 은 요소 대상 을 저장 합 니 다.
다음 코드 는 하 나 를 초기 화 하 는 방법ArrayBlockingQueue을 설명 하고 대상 을 추가 합 니 다.

BlockingQueue queue = new ArrayBlockingQueue(1024);
queue.put("1");   //        
Object object = queue.take();   //        
BlockingQueue대기 열 에 저 장 된 데이터 의 유형 을 범 형 으로 제한 할 수 있 습 니 다.아래 코드 는 String 을 범 형 으로 하여 이 대기 열 은 String 형식 만 저장 할 수 있 음 을 나타 냅 니 다.

BlockingQueue<String> queue = new ArrayBlockingQueue<String>(1024);
queue.put("1");
String string = queue.take();
생산 소비의 실례 를 실현 하 다
앞의 글 에서 우 리 는 BlockingQueue 는 소 비 를 생산 하 는 버퍼 대기 열 에 자주 사용 된다 고 말 한 적 이 있다.다음은 생산 소 비 를 진정 으로 실현 하 는 예ArrayBlockingQueue를 사용 하 겠 습 니 다.
클래스BlockingQueueExample는 두 개의 독립 스 레 드 를 엽 니 다.하 나 는Producer생산자 스 레 드 로 대기 열 에 데 이 터 를 추가 하 는 것 을 책임 집 니 다.다른 하 나 는Consumer소비자 스 레 드 로 대기 열 에서 데 이 터 를 꺼 내 처리 하 는 것 을 책임 진다.

public class BlockingQueueExample {

    public static void main(String[] args) throws Exception {
        //  ArrayBlockingQueue     BlockingQueue,        1024
        BlockingQueue queue = new ArrayBlockingQueue(1024);
        
        Producer producer = new Producer(queue);  //   
        Consumer consumer = new Consumer(queue);  //   

        new Thread(producer).start();  //       
        new Thread(consumer).start();  //       

        Thread.sleep(4000);
    }
}
클래스Producer는 생산자 로 10 초 간격 으로put()방법 으로 대기 열 에 한 대상 을 넣 고 세 번 넣는다.10 초 간격 으로 대기 열 데 이 터 를 소비자 가 가 져 가면 소비자 스 레 드 가 막 힐 것 이다.

public class Producer implements Runnable{

    protected BlockingQueue queue = null;

    public Producer(BlockingQueue queue) {
        this.queue = queue;
    }

    public void run() {
        try {
            queue.put("1");
            Thread.sleep(10000);
            queue.put("2");
            Thread.sleep(10000);
            queue.put("3");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
아래 코드 는 소비자 류Consumer로 대기 열 에서 처리 할 요소 대상 을 가 져 오고System.out를 호출 하여 인쇄 합 니 다.

public class Consumer implements Runnable{

    protected BlockingQueue queue = null;

    public Consumer(BlockingQueue queue) {
        this.queue = queue;
    }

    public void run() {
        try {
            System.out.println(queue.take());
            System.out.println(queue.take());
            System.out.println(queue.take());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
위의 코드 인쇄 결 과 는 10 초 에 한 번 씩 인쇄 되 는 것 입 니 다.그 중에서take()방법 은 대기 열 에 요 소 를 찾 을 수 없 을 때 현재 소비자 스 레 드 를 막 고 대기 상태 에 있 기 때 문 입 니 다.이 방법 은 우리 가 지난 절 에 소개BlockingQueue했 을 때 이미 설명 을 했 습 니 다.
이상 은 자바 병렬 프로 그래 밍 도구 류 JUC 의 Array BlockingQueue 에 대한 상세 한 내용 입 니 다.자바 병렬 프로 그래 밍 도구 류 Array BlockingQueue 에 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!

좋은 웹페이지 즐겨찾기