Java의 BlockingQueue 란 무엇이며 어떻게 구현합니까?



Java의 BlockingQueue에 대한이 기사는 BlockingQueue 인터페이스에 대해 배우는 데 도움이 될 것입니다. 또한 방법 및 실용적인 구현에 대한 통찰력을 제공합니다.

광범위한 내장 기능으로 인해 프로그래머들 사이에서 매우 인기가 있습니다. 대부분의 경우 문제가 나타나기 전에도 문제에 대한 전용 솔루션이 있습니다. 매우 유용하고 중요한 부분 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-Edureka상호 작용 스레드로부터 안전하므로 주로 생산자-소비자간에 사용됩니다.내 말은 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 개의 클래스를 만들 것입니다.

  1. EduProducer
  2. EduConsumer
  3. 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'의 주석 섹션에 언급 해 주시면 가능한 한 빨리 연락 드리겠습니다.