광범위한 내장 기능으로 인해 프로그래머들 사이에서 매우 인기가 있습니다. 대부분의 경우 문제가 나타나기 전에도 문제에 대한 전용 솔루션이 있습니다. 매우 유용하고 중요한 부분 Java의 BlockingQueue 인터페이스입니다. 이 기사의 매체를 통해 Java의 BlockingQueue와이를 구현하는 방법에 대해 설명하겠습니다.
다음은이 기사에서 다루는 주제입니다.
자바의 BlockingQueue 인터페이스
자바의 BlockingQueue ConcurrentHashMap, CopyOnWriteArrrayList 등과 같은 몇 가지 다른 동시 유틸리티 클래스와 함께 Java 1.5에 추가 된 인터페이스입니다. BlockingQueue 인터페이스는 java.util.concurrent 꾸러미 .이 인터페이스는 스레드가 빈 대기열을 빼거나 전체 대기열을 추가하려는 경우 차단을 활성화하여 흐름 제어를 향상시킵니다. 두 경우 모두이 인터페이스가 유용합니다.간단히 말해서, 이미 가득 찬 대기열에 요소를 추가하려고합니다. 프로그램의이 시점에서 BlockingQueue가 호출되어 다른 스레드가 공간을 만들기 위해 큐를 해제 할 때까지 특정 스레드를 차단합니다. 이는 전체 대기열의 정리 요소가 대기열에서 제외 된 결과 일 수 있습니다. 마찬가지로 BlockingQueue는 다른 스레드가 빈 큐에 요소를 삽입하거나 추가 할 때까지 이미 비어있는 큐에서 큐를 빼려는 스레드를 차단하기 위해 호출됩니다. 열 .
Java에서 BlockingQueue 인터페이스로 작업하는 동안 널값을 허용하지 않는다는 점을 기억해야합니다. 그렇게하려고하면 즉시 NullPointerException이 발생합니다. 아래 그림은 Java에서 BlockingQueue 인터페이스의 작동을 나타냅니다.
이 상호 작용 스레드로부터 안전하므로 주로 생산자-소비자간에 사용됩니다.내 말은 BlockingQueue 인터페이스를 사용하여 생산자와 소비자 모두가 공유 할 수있는 대기열을 만들 수 있다는 것입니다.
자바에서 해시 맵을 구현하는 방법
Java에서 BlockingQueue를 사용하려면 먼저 해당 유형에 익숙해 져야합니다. 이 기사의 다음 섹션에서 소개해 드리겠습니다.
Java의 BlockingQueue 생성자 유형
Java의 BlockingQueue 인터페이스 생성자에는 두 가지 유형이 있습니다.
- 무제한 대기열 : 이 유형의 대기열에 대해 용량은 Integer.MAX_VALUE로 설정됩니다. 제한되지 않은 큐는 요소가 삽입 될 때마다 동적으로 커질 수 있으므로 차단되지 않습니다. 다음은 제한되지 않은 대기열을 만드는 구문입니다.
BlockingQueue bq = 새로운 LinkedBlockingDeque ()
- 제한된 대기열 : 이러한 종류의 대기열의 경우 대기열 생성시 대기열의 용량을 전달해야합니다. 건축업자 매개 변수. 일단 크기가 지정되면 변경할 수 없습니다. 다음은 제한된 대기열을 만드는 구문입니다.
BlockingQueue bq = 새로운 LinkedBlockingDeque (10)
이제 Java에서 BlockingQueue를 구현하는 방법에 익숙해 졌으므로 몇 가지 방법을 나열하겠습니다.
BlockingQueue 인터페이스의 메서드
방법 | 기술 |
부울 추가 (E e) | 이 방법은 큐에 공간이있는 경우 지정된 요소를이 큐에 삽입하는 데 도움이됩니다.던지다IllegalStateException |
부울 contains (Object o) | 큐에 지정된 요소가 포함 된 경우이 메서드는 true를 반환합니다. |
int drainTo (콜렉션 c) | 이 메서드는 큐에서 사용 가능한 모든 요소를 제거하고 지정된 컬렉션에 추가합니다. |
int drainTo (컬렉션 c, int maxElements) | 이 메서드는 대기열에서 주어진 수의 사용 가능한 요소를 제거하고 지정된 요소에 추가합니다. |
booloean 제공 (E e) | 이 메서드는 지정된 요소가 가득 차지 않은 경우 큐에 삽입하고 true를 반환합니다. 그렇지 않으면 false를 반환합니다. |
부울 제공 (E e, 긴 시간 초과, TimeUnit 단위) | 이 메서드는 지정된 요소를 큐에 삽입합니다. 큐가 가득 찬 경우 공간을 사용할 수있을 때까지 지정된 대기 시간까지 대기합니다. |
E poll (긴 타임 아웃, TimeUnit 단위) | 이 방법은 큐의 헤드를 검색하고 제거하는 데 도움이됩니다. 큐가 비어있는 경우 요소를 사용할 수있을 때까지 지정된 대기 시간까지 대기합니다. |
무효 풋 (E e) | 이 메서드는 큐가 가득 찬 경우 공간을 사용할 수있을 때까지 대기하여 지정된 요소를 큐에 삽입합니다. |
int leftCapacity () | 이 메서드는이 큐가 차단되지 않고 이상적으로 받아 들일 수있는 추가 요소 수를 반환하는 데 도움이됩니다. |
부울 제거 (Object o) | 이 메소드는 존재하는 경우에만 대기열에서 지정된 요소의 단일 인스턴스를 제거합니다. |
E take () | 이 메서드는 큐가 비어있는 경우 요소를 사용할 수있을 때까지 대기하여 큐 헤드를 검색하고 제거하는 데 도움이됩니다. |
BlockingQueue 구현
여기서는 Java에서 BlockingQueue의 간단한 예제를 구현할 것입니다.EduProducer 클래스는 데이터를 생성하고이를 열 동시에 다른 클래스 인 EduConsumer는 동일한 대기열에서 데이터를 제거합니다.
이를 위해 3 개의 클래스를 만들 것입니다.
- EduProducer
- EduConsumer
- EdurekaMain
이제 이러한 각 클래스를 하나씩 만들어 보겠습니다.
EduProducer.java
package edureka import java.util.concurrent.BlockingQueue public class EduProducer는 Runnable {private final BlockingQueue queue @Override public void run () {try {process ()} catch (InterruptedException e) {Thread.currentThread (). interrupt ()}를 구현합니다. } private void process () throws InterruptedException {// (int i = 0 i<10 i++) { System.out.println('[Producer] Add : ' + i) queue.put(i) System.out.println('[Producer] Queue's Remaining Capacity : ' + queue.remainingCapacity()) Thread.sleep(150) } } public EduProducer(BlockingQueue queue) { this.queue = queue } }
EduConsumer.java
package edureka import java.util.concurrent.BlockingQueue public class EduConsumer는 Runnable {private final BlockingQueue queue @Override public void run () {try {while (true) {Integer take = queue.take () process (take)}} catch를 구현합니다. (InterruptedException e) {Thread.currentThread (). interrupt ()}} private void process (Integer take) throws InterruptedException {System.out.println ( '[Consumer] Remove :'+ take) Thread.sleep (500)} public EduConsumer (BlockingQueue 대기열) {this.queue = 대기열}}
EdurekaMain.java
자바의 해시 맵과 해시 테이블
package edureka import java.util.concurrent.BlockingQueue import java.util.concurrent.LinkedBlockingQueue public class EdurekaMain {public static void main (String [] args) {BlockingQueue queue = new LinkedBlockingQueue (10) new Thread (new EduProducer (queue)) .start () new Thread (new EduConsumer (queue)). start ()}}
코드 작성이 끝나면 프로그램을 실행하여 아래 출력을 얻습니다.
[프로듀서] 추가 : 0 [소비자] 테이크 : 0 [프로듀서] 대기열의 남은 용량 : 9 [프로듀서] 추가 : 1 [프로듀서] 대기열의 남은 용량 : 9 [프로듀서] 추가 : 2 [프로듀서] 대기열의 남은 용량 : 8 [프로듀서] ] 추가 : 3 [Producer] Queue 남은 용량 : 7 [Consumer] Take : 1 [Producer] 추가 : 4 [Producer] Queue의 남은 용량 : 7 [Producer] 추가 : 5 [Producer] Queue의 남은 용량 : 6 [Producer] 추가 : 6 [Producer] Queue의 남은 용량 : 5 [Consumer] Take : 2 [Producer] 추가 : 7 [Producer] Queue의 남은 용량 : 5 [Producer] 추가 : 8 [Producer] Queue의 남은 용량 : 4 [Producer] 추가 : 9 [프로듀서] 대기열의 남은 용량 : 3 [소비자] 테이크 : 3 [소비자] 테이크 : 4 [소비자] 테이크 : 5 [소비자] 테이크 : 6 [소비자] 테이크 : 7 [소비자] 테이크 : 8 [소비자] 테이크 : 9
이것으로 Java의 BlockingQueue에 대한이 기사의 끝으로 이동합니다. Java를 더 자세히 배우려면 다음을 참조하십시오. 게다가.
이제 Java에서 BlockingQueue의 기본 사항을 이해 했으므로 전 세계에 걸쳐 250,000 명 이상의 만족 한 학습자 네트워크를 보유한 신뢰할 수있는 온라인 학습 회사 인 Edureka에서 작성했습니다. Edureka의 Java J2EE 및 SOA 교육 및 인증 과정은 Java 개발자가 되고자하는 학생과 전문가를 위해 설계되었습니다. 이 과정은 Java 프로그래밍을 시작하고 Hibernate & Spring과 같은 다양한 Java 프레임 워크와 함께 핵심 및 고급 Java 개념에 대해 교육하도록 설계되었습니다.
질문이 있으십니까? 이 'Java의 BlockingQueue'의 주석 섹션에 언급 해 주시면 가능한 한 빨리 연락 드리겠습니다.