자바 병렬 프로 그래 밍 도구 류 JUC 의 Array BlockingQueue
4417 단어 자바ArrayBlockingQueue
자바 BlockingQueue 에서 하나의 개념 을 설명 할 수 있 습 니 다.대기 열 을 막 는 것 은 대기 열 자체 가 스 레 드 를 막 아 대기 열 에 요 소 를 삽입 하거나 스 레 드 를 막 아 대기 열 에서 요 소 를 가 져 오 는 것 을 말 합 니 다.예 를 들 어 하나의 스 레 드 가 빈 대기 열 에서 요 소 를 가 져 오 려 고 시도 할 때 이 스 레 드 는 대기 열 에 있 는 요소 의 수량 이 더 이상 비어 있 지 않 을 때 까지 막 힐 것 입 니 다.물론 스 레 드 가 막 히 는 지 여 부 는 BlockingQueue 에서 요 소 를 얻 는 방법 에 달 려 있 습 니 다.어떤 방법 은 스 레 드 를 막 을 수 있 고 어떤 방법 은 이상 을 던 질 수 있 습 니 다.다음 글 은 저희 가 상세 하 게 소개 하 겠 습 니 다.
클래스
ArrayBlockingQueue
는BlockingQueue
인터페이스의 실현 클래스 로 경계 가 있 는 차단 대기 열 이 고 내부 에 배열 로 대기 열 요 소 를 저장 합 니 다.이곳 의'유 계'는 저장 용량 에 상한 선 이 있어 원 소 를 무한 저장 할 수 없다 는 것 을 말한다.같은 시간 에 메모리 저장 용량 에 상한 값 이 존재 합 니 다.이 는 초기 예화 할 때 지정 한 것 으로 제한 되 어 있 으 며 그 후에 수정 할 수 없습니다.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 에 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.