English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Java 기본 튜토리얼

Java 프로세스 제어

Java 배열

Java 상대적 객체(I)

Java 상대적 객체(II)

Java 상대적 객체(III)

Java 예외 처리

Java 목록(List)

Java Queue(큐)

Java Map 집합

Java Set 집합

Java 입력 출력(I/O)

Java Reader/Writer

Java 다른 주제

Java LinkedBlockingQueue

이 튜토리얼에서는 예제를 통해 LinkedBlockingQueue 클래스 및 메서드를 배울 것입니다.

Java Collections 프레임워크의 LinkedBlockingQueue 클래스는 링크드 리스트를 사용하여 블록된 큐 구현을 제공합니다.

이를 통해 구현됩니다Java BlockingQueue 인터페이스.

LinkedBlockingQueue 생성

링크드 블록 큐를 생성하려면 java.util.concurrent.LinkedBlockingQueue 패키지를 가져오는 것이 필요합니다.

이렇게 Java에서 링크드 블록 큐를 생성하는 방법입니다:

1. 초기 용량 없음

LinkedBlockingQueue<Type> animal = new LinkedBlockingQueue<>();

이곳에서, 초기 용량은 기본적으로2 31 -1.

2. 초기 용량을 가지고 있습니다

LinkedBlockingQueue<Type> animal = new LinkedBlockingQueue<>(int capacity);

이곳에서

  • 형식 - 링크드 블록 큐의 형식

  • 용량 - 링크드 블록 큐의 크기

예를 들어,

//크기가5의 문자형 LinkedBlockingQueue
LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>();5);
//크기가5의 정수형 LinkedBlockingQueue
LinkedBlockingQueue<Integer> age = new LinkedBlockingQueue<>();5);

주의:리스트의 크기는 필수가 아닙니다.

LinkedBlockingQueue 메서드

LinkedBlockingQueue 클래스는 제공합니다BlockingQueue 인터페이스모든 메서드의 구현.

이 메서드들은 링크드 블록 큐에서 요소를 삽입, 접근 및 제거하는 데 사용됩니다.

또한, put(), take()라는 두 가지 메서드를 배울 것입니다. 이들은 링크드 블록 큐의 블록된 연산을 지원합니다.

이 두 가지 메서드는 링크드 블록 큐를 다른 표준 큐와 구분합니다.

요소를 삽입합니다

  • add()를 사용하여 - 지정된 요소를 링크드 블록 큐에 삽입합니다. 큐가 가득 차면 예외를 발생시킵니다.

  • offer()를 사용하여 - 지정된 요소를 링크드 블록 큐에 삽입합니다. 큐가 가득 차면 false를 반환합니다.

예를 들어,

import java.util.concurrent.LinkedBlockingQueue;
class Main {
    public static void main(String[] args) {
        LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>();5);
        // add()를 사용하여
        animals.add("Dog");
        animals.add("Cat");
        // offer()를 사용하여
        animals.offer("Horse");
        System.out.println("LinkedBlockingQueue: ", + animals);
    }
}

출력 결과

LinkedBlockingQueue: [Dog, Cat, Horse]

요소에 접근합니다

  • peek() - 링크드 블록 큐의 앞쪽에서 요소를 반환합니다. 큐가 비어 있으면 null을 반환합니다.

  • iterator() - 이터레이터 객체를 반환하여 링크드 블록 큐의 요소를 순서대로 접근할 수 있습니다. 큐가 비어 있으면 예외가 발생합니다. 이터레이터를 사용하려면 java.util.Iterator 패키지를 가져오는 것이 필요합니다.

예를 들어,

import java.util.concurrent.LinkedBlockingQueue;
import java.util.Iterator;
class Main {
    public static void main(String[] args) {
        LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>();5);
        //요소 추가
        animals.add("Dog");
        animals.add("Cat");
        animals.add("Horse");
        System.out.println("LinkedBlockingQueue: ", + animals);
        // peek() 사용
        String element = animals.peek();
        System.out.println("요소 접근: " + element);
        // iterator() 사용
        Iterator<String> iterate = animals.iterator();
        System.out.print("LinkedBlockingQueue 요소: ");
        while(iterate.hasNext()) {
            System.out.print(iterate.next());
            System.out.print(", ");
        }
    }
}

출력 결과

LinkedBlockingQueue: [Dog, Cat, Horse]
요소 접근: Dog
LinkedBlockingQueue 요소: Dog, Cat, Horse,

요소 제거

  • remove() - 지정된 요소를 반환하고 리스트 블록 큐에서 제거합니다. 팀이 비어 있다면 예외를 던집니다。

  • poll() - 지정된 요소를 반환하고 리스트 블록 큐에서 제거합니다. 팀이 비어 있다면 null을 반환합니다。

  • clear() - 리스트 블록 큐에서 모든 요소를 제거합니다。

예를 들어,

import java.util.concurrent.LinkedBlockingQueue;
class Main {
    public static void main(String[] args) {
        LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>();5);
        animals.add("Dog");
        animals.add("Cat");
        animals.add("Horse");
        System.out.println("LinkedBlockingQueue " + animals);
        // remove() 사용
        String element1 = animals.remove();
        System.out.println("요소 제거:");
        System.out.println("remove() 사용: " + element1);
        // poll() 사용
        String element2 = animals.poll();
        System.out.println("poll() 사용: " + element2);
        // clear() 사용
        animals.clear();
        System.out.println("更新된LinkedBlockingQueue " + animals);
    }
}

출력 결과

LinkedBlockingQueue: [Dog, Cat, Horse]
요소 제거:
remove() 사용: Dog
poll() 사용: Cat
更新된LinkedBlockingQueue: []

put()과 take() 메서드

다중 스레드 과정에서, 우리는 put()과 take()를 사용하여 스레드를 블록하여 다른 스레드와 동기화할 수 있습니다. 이 메서드는 성공적으로 실행할 수 있을 때까지 기다립니다.

put() 메서드

지정된 요소를 링크드 블록 큐의 마지막에 삽입하려면 put() 메서드를 사용합니다.

만약 링크드 블록 큐가 가득 찬 경우, 그것은 요소를 삽입할 공간이 링크드 블록 큐에 들어올 때까지 기다립니다.

예를 들어,

import java.util.concurrent.LinkedBlockingQueue;
class Main {
    public static void main(String[] args) {
        LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>();5);
       try {
          //elements에 요소 추가
           animals.put("Dog");
           animals.put("Cat");
           System.out.println("LinkedBlockingQueue: ", + animals);
        }
        catch(Exception e) {
            System.out.println(e);
        }
    }
}

출력 결과

LinkedBlockingQueue: [Dog, Cat]

여기서, 기다리는 중에 중단되면 put() 메서드는 InterruptedException를 표시할 수 있습니다. 따라서, 우리는 그것을 포함해야 합니다.try..catch 블록에서.

take() 메서드

링크드 블록 큐의 앞쪽에서 요소를 반환하고 제거하려면 take() 메서드를 사용할 수 있습니다.

만약 링크드 블록 큐가 비어 있으면, 그것은 제거할 요소가 링크드 블록 큐에 들어올 때까지 기다립니다.

예를 들어,

import java.util.concurrent.LinkedBlockingQueue;
class Main {
    public static void main(String[] args) {
        LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>();5);
       try {
           //elements에 요소 추가
           animals.put("Dog");
           animals.put("Cat");
           System.out.println("LinkedBlockingQueue: ", + animals);
           //요소 제거
           String element = animals.take();
           System.out.println("요소 제거: ", + element);
           System.out.println("새로운 LinkedBlockingQueue: ", + animals);
        }
        catch(Exception e) {
            System.out.println(e);
        }
    }
}

출력 결과

LinkedBlockingQueue: [Dog, Cat]
요소 제거: [Dog]
새로운 LinkedBlockingQueue: [Cat]

여기서, 기다리는 중에 중단되면 take() 메서드는 InterruptedException를 표시합니다. 따라서, 우리는 그것을 try...catch 블록 내에 감싸야 합니다.

기타 메서드

메서드콘텐츠 설명
contains(element)링크드 블록퀸 퀸에서 지정된 요소를 검색합니다. 요소가 발견되면 true를 반환하고, 발견되지 않으면 false를 반환합니다.
size()링크드 블록퀸 퀸의 길이를 반환합니다.
toArray()링크드 블록퀸 퀸을 배열로 변환하고 해당 배열을 반환합니다.
toString()링크드 블록퀸 퀸을 문자열로 변환하려면

LinkedBlockingQueue를 사용하는 이유는 무엇인가요?

LinkedBlockingQueue는 내부 저장소로 링크드 라이스를 사용합니다.

이는 다음과 같이 간주됩니다스레드 안전콜렉션입니다. 따라서, 이는 보통 멀티 스레드 애플리케이션에서 사용됩니다.

한 스레드가 요소를 큐에 삽입하고 다른 스레드가 큐에서 요소를 제거하는 경우를 가정해 보겠습니다.

현재, 첫 번째 스레드가 두 번째 스레드보다 느리다면, 링크드 블록퀸 퀸이 두 번째 스레드를 기다리게 할 수 있습니다. 첫 번째 스레드가 그 작업을 완료할 때까지.